跳到主要內容

使用沒有超級使用者角色的帳戶

如果您不是使用具有超級使用者角色的帳戶 (或 rds_superuser 作為使用 Amazon Aurora 或 Amazon RDS 時的角色),您需要建立多個物件以擷取資料定義語言 (DDL) 事件。在所選的帳戶中建立這些物件,然後在主要使用者帳戶中建立觸發條件。

資訊備註透過 Google Cloud SQL for PostgreSQL 使用具有超級使用者角色的帳戶需要 Data Movement gateway 2024.11.14 或更高版本。

要執行的操作:

  1. 選擇您想要建立物件的結構描述。預設結構描述是公用性質。確保該結構描述存在而且可由非特殊權限帳戶存取。
  2. 執行以下命令以建立表格 attrep_ddl_audit

    create table <objects_schema>.attrep_ddl_audit
    (
    c_key    bigserial primary key,
    c_time   timestamp,    -- Informational
    c_user   varchar(64),  -- Informational: Current_user
    c_txn    varchar(16),  -- Informational: Current transaction
    c_tag    varchar(24),  -- Either 'CREATE TABLE' or 'ALTER TABLE' or 'DROP TABLE'
    c_oid    integer,      -- For future use - TG_OBJECTID
    c_name   varchar(64),  -- For future use - TG_OBJECTNAME
    c_schema varchar(64),  -- For future use - TG_SCHEMANAME. For now, holds the current_schema
    c_ddlqry  text         -- The DDL query associated with the current DDL event
    );
  3. 執行以下命令以建立函數 attrep_intercept_ddl

    CREATE OR REPLACE FUNCTION <objects_schema>.attrep_intercept_ddl()
      RETURNS event_trigger
    LANGUAGE plpgsql
      AS $$
      declare _qry text;
    BEGIN
      if (tg_tag='CREATE TABLE' or tg_tag='ALTER TABLE' or tg_tag='DROP TABLE') then
             SELECT current_query() into _qry;
             insert into <objects_schema>.attrep_ddl_audit
             values
             (
             default,current_timestamp,current_user,cast(TXID_CURRENT()as varchar(16)),tg_tag,0,'',current_schema,_qry
             );
             delete from <objects_schema>.attrep_ddl_audit;
    end if;
    END;
    $$;
    
  4. 如果您使用非特殊權限帳戶登入,請登出非特殊權限帳戶,然後使用獲指派超級使用者角色的帳戶登入 (或 rds_superuser 作為使用 Amazon Aurora 或 Amazon RDS 時的角色)。

    資訊備註

    如果預設結構描述中沒有建立 attrep_intercept_ddl 儲存程序,您需要在 PostgreSQL 連接器設定的在結構描述中建立 DDL 成品欄位中指定結構描述名稱。

    如需更多關於複寫設定參數的資訊,請參閱 PostgreSQL 說明。

  5. 執行以下命令以建立事件觸發條件 attrep_intercept_ddl

    CREATE EVENT TRIGGER attrep_intercept_ddl ON ddl_command_end

    EXECUTE PROCEDURE <objects_schema>.attrep_intercept_ddl();

  6. 向非特殊權限帳戶授予以下權限:

    • GRANT INSERT ON attrep_ddl_audit to <non-privileged-user>;
    • GRANT DELETE ON attrep_ddl_audit to <non-privileged-user>;
    • GRANT USAGE ON attrep_ddl_audit_c_key_seq TO <non-privileged-user>;

    • ALTER ROLE <non-privileged-user> WITH REPLICATION;

    • GRANT rds_replication to <non-privileged-user>;

  7. 向使用者授予 SELECT 權限:

    GRANT SELECT ON ALL TABLES IN SCHEMA <SCHEMA _NAME> TO <non-privileged-user>;

  8. 向使用者授予對該結構描述的使用權:

    GRANT USAGE ON SCHEMA <SCHEMA_NAME> TO <non-privileged-user>;

此頁面是否對您有幫助?

若您發現此頁面或其內容有任何問題——錯字、遺漏步驟或技術錯誤——請告知我們可以如何改善!