# Använda ett konto utan superuser-rollen

Om du inte använder ett konto med superuser-rollen (eller rds\_superuser-rollen när du arbetar med Amazon Aurora eller Amazon RDS) måste du skapa flera objekt för att fånga DDL-händelser (Data Definition Language). Skapa dessa objekt i det valda kontot och skapa sedan en trigger i huvudanvändarkontot.

Anteckning om informationAtt använda ett konto med superuser-rollen med Google Cloud SQL för PostgreSQL kräver Gateway för dataflytt 2024.11.14 eller senare.

För att göra detta:

1. Välj ett schema där du vill att objekten ska skapas. Standardschemat är offentligt. Kontrollera att schemat finns och att det är tillgängligt för det icke-behöriga kontot.

2. Skapa tabellen attrep\_ddl\_audit genom att köra följande kommando:

   ```
   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. Skapa funktionen attrep\_intercept\_ddl genom att köra följande kommando:

   ```
   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. Om du är inloggad med ett icke-behörigt konto loggar du ut från det icke-behöriga kontot och loggar in med ett konto som har tilldelats superuser-rollen (eller rds\_superuser-rollen när du arbetar med Amazon Aurora eller Amazon RDS).

   Anteckning om information

   Om den lagrade processen attrep\_intercept\_ddl inte skapas i standardschemat måste du ange schemanamnet i fältet Skapa DDL-artefakter i schema i PostgreSQL-kopplingens inställningar.

   Mer information om parametrarna för replikeringsinställning finns i hjälpavsnittet för PostgreSQL.

5. Skapa händelsetriggern attrep\_intercept\_ddl genom att följande kommando:

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

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

6. Ge följande behörigheter till det icke-behöriga kontot:

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

   * När du arbetar med PostgreSQL lokalt, Microsoft Azure Database för PostgreSQL, Google Cloud SQL för PostgreSQL eller Google Cloud AlloyDB för PostgreSQL, bevilja följande behörighet:

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

   * När du arbetar med Amazon RDS för PostgreSQL eller Amazon Aurora ska du ge följande behörighet:

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

7. Ge SELECT-behörighet till användaren:

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

8. Ge användaren behörighet att använda schemat:

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