# Usando uma conta sem a função de superusuário

Se você não estiver usando uma conta com a função de superusuário (ou a função rds\_superuser ao trabalhar com o Amazon Aurora ou o Amazon RDS), precisará criar vários objetos para capturar eventos de DDL (Data Definition Language). Crie esses objetos na conta selecionada e, em seguida, crie um gatilho na conta de usuário principal.

Nota informativaO uso de uma conta com a função de superusuário com o Google Cloud SQL for PostgreSQL requer o endereço Gateway Data Movement 2024.11.14 ou posterior.

Para fazer:

1. Selecione um esquema no qual você deseja que os objetos sejam criados. O esquema padrão é público. Certifique-se de que o esquema exista e seja acessível pela conta sem privilégios.

2. Crie a tabela attrep\_ddl\_audit executando o seguinte comando:

   ```
   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. Crie a função attrep\_intercept\_ddl executando o seguinte comando:

   ```
   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. Se você estiver conectado com uma conta sem privilégios, saia da conta sem privilégios e faça login com uma conta que tenha a função de superusuário (ou a função rds\_superuser ao trabalhar com o Amazon Aurora ou o Amazon RDS) atribuída a ela.

   Nota informativa

   Se o procedimento armazenado attrep\_intercept\_ddl não estiver sendo criado no esquema padrão, você precisará especificar o nome do esquema no campo Criar artefatos de DDL no esquema nas configurações do conector do PostgreSQL.

   Para obter mais informações sobre os parâmetros de configuração de replicação, consulte a Ajuda do PostgreSQL.

5. Crie o gatilho de evento attrep\_intercept\_ddl executando o seguinte comando:

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

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

6. Conceda as seguintes permissões à conta não privilegiada:

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

   * Ao trabalhar com o PostgreSQL no local, com o banco de dados do Microsoft Azure for PostgreSQL, com o Google Cloud SQL for PostgreSQL ou com o Google Cloud AlloyDB for PostgreSQL, conceda a seguinte permissão:

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

   * Ao trabalhar com o Amazon RDS for PostgreSQL ou com o Amazon Aurora, conceda a seguinte permissão:

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

7. Conceda a permissão SELECT ao usuário:

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

8. Concede o uso do esquema ao usuário:

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