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

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

資訊備註透過 Google Cloud SQL for PostgreSQL 使用具有超級使用者角色的帳戶需要 資料移動閘道 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 &lt;objects\_schema&gt;.attrep\_intercept\_ddl();

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

   * GRANT INSERT ON attrep\_ddl\_audit to &lt;non-privileged-user&gt;;

   * GRANT DELETE ON attrep\_ddl\_audit to &lt;non-privileged-user&gt;;

   * GRANT USAGE ON attrep\_ddl\_audit\_c\_key\_seq TO &lt;non-privileged-user&gt;;

   * 使用內部部署 PostgreSQL、Microsoft Azure Database for PostgreSQL、Google Cloud SQL for PostgreSQL 或 Google Cloud AlloyDB for PostgreSQL 時，授予下列權限：

     ALTER ROLE &lt;non-privileged-user&gt; WITH REPLICATION;

   * 使用 Amazon RDS for PostgreSQL 或 Amazon Aurora 時，請授予下列權限：

     GRANT rds\_replication to &lt;non-privileged-user&gt;;

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

   GRANT SELECT ON ALL TABLES IN SCHEMA &lt;SCHEMA \_NAME&gt; TO &lt;non-privileged-user&gt;;

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

   GRANT USAGE ON SCHEMA &lt;SCHEMA\_NAME&gt; TO &lt;non-privileged-user&gt;;