# Verwenden eines Kontos ohne die Rolle „superuser“

Wenn Sie kein Konto mit der Rolle superuser (oder der Rolle rds\_superuser, falls mit Amazon Aurora oder Amazon RDS gearbeitet wird) verwenden, müssen Sie mehrere Objekte erstellen, um DLL-Ereignisse (Data Definition Language) zu erfassen. Erstellen Sie diese Objekte im ausgewählten Konto und erstellen Sie dann einen Auslöser im Hauptbenutzerkonto.

InformationshinweisDie Verwendung eines Kontos mit der Rolle superuser mit Google Cloud SQL für PostgreSQL erfordert Data Movement gateway 2024.11.14 oder höher.

Gehen Sie wie folgt vor:

1. Wählen Sie ein Schema, in dem die Objekte erstellt werden sollen. Das Standardschema ist öffentlich. Vergewissern Sie sich, dass das Schema vorhanden und für das Konto ohne Berechtigungen zugänglich ist.

2. Erstellen Sie die Tabelle attrep\_ddl\_audit, indem Sie den folgenden Befehl ausführen:

   ```
   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. Erstellen Sie die Funktion attrep\_intercept\_ddl, indem Sie den folgenden Befehl ausführen:

   ```
   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. Wenn Sie mit einem Konto ohne Berechtigungen angemeldet sind, melden Sie sich von dem Konto ohne Berechtigungen ab und melden sich mit einem Konto an, dem die Rolle superuser (oder die Rolle rds\_superuser, wenn mit Amazon Aurora oder Amazon RDS gearbeitet wird) zugewiesen ist.

   Informationshinweis

   Wenn die gespeicherte Prozedur attrep\_intercept\_ddl nicht im Standardschema erstellt wird, müssen Sie den Schemanamen im Feld DDL-Artefakte in Schema erstellen in den PostgreSQL-Konnektoreinstellungen angeben.

   Weitere Informationen zu den Replikationskonfigurationsparametern finden Sie in der PostgreSQL-Hilfe.

5. Erstellen Sie den Ereignisauslöser attrep\_intercept\_ddl, indem Sie den folgenden Befehl ausführen:

   CREATE EVENT TRIGGER attrep\_intercept\_ddl ON ddl\_command\_end

   EXECUTE PROCEDURE &lt;objects\_schema&gt;.attrep\_intercept\_ddl();

6. Erteilen Sie dem Konto ohne Berechtigungen die folgenden Berechtigungen:

   * 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;;

   * Wenn Sie mit PostgreSQL (lokal), Microsoft Azure Database für PostgreSQL, Google Cloud SQL für PostgreSQL oder Google Cloud AlloyDB für PostgreSQL arbeiten, erteilen Sie die folgende Berechtigung:

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

   * Wenn Sie mit Amazon RDS für PostgreSQL oder Amazon Aurora arbeiten, erteilen Sie die folgende Berechtigung:

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

7. Erteilen Sie dem Benutzer die Berechtigung SELECT:

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

8. Erteilen Sie dem Benutzer die Nutzungsberechtigung für das Schema:

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