# スーパーユーザー ロールを持たないアカウントの使用

スーパーユーザー ロール (Amazon Aurora または Amazon RDS を使用する場合は rds\_superuser ロール) を持つアカウントを使用していない場合は、データ定義言語 (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. 権限のないアカウントでログインしている場合は、権限のないアカウントからログアウトし、スーパーユーザー ロール (Amazon Aurora または Amazon RDS を使用している場合は rds\_superuser ロール) が割り当てられているアカウントでログインします。

   情報メモ

   attrepintercept\_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;;