Ir para conteúdo principal

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 Data Movement gateway 2024.11.14 ou posterior.

Para fazer isso:

  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 <objects_schema>.attrep_intercept_ddl();

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

    • GRANT INSERT ON attrep_ddl_audit to <non-privileged-user>;
    • GRANT DELETE ON attrep_ddl_audit to <non-privileged-user>;
    • GRANT USAGE ON attrep_ddl_audit_c_key_seq TO <non-privileged-user>;

    • ALTER ROLE <non-privileged-user> WITH REPLICATION;

    • GRANT rds_replication to <non-privileged-user>;

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

    GRANT SELECT ON ALL TABLES IN SCHEMA <SCHEMA _NAME> TO <non-privileged-user>;

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

    GRANT USAGE ON SCHEMA <SCHEMA_NAME> TO <non-privileged-user>;

Esta página ajudou?

Se você encontrar algum problema com esta página ou seu conteúdo - um erro de digitação, uma etapa ausente ou um erro técnico - informe-nos como podemos melhorar!