# Utilizzo di un account senza il ruolo di utente avanzato

Se non si utilizza un account con il ruolo di superuser (utente avanzato), o il ruolo rds\_superuser quando si utilizza Amazon Aurora o Amazon RDS, è necessario creare diversi oggetti per acquisire gli eventi di Data Definition Language (DDL). Creare questi oggetti nell'account selezionato, quindi creare un trigger nell'account utente principale.

Nota informaticaL'utilizzo di un account con il ruolo di superuser con Google Cloud SQL per PostgreSQL richiede Gateway Data Movement 2024.11.14 o versione successiva.

Operazione da eseguire:

1. Scegliere uno schema in cui si desidera che vengano creati gli oggetti. Lo schema predefinito è pubblico. Assicurarsi che lo schema esista e sia accessibile dall'account non privilegiato.

2. Creare la tabella attrep\_ddl\_audit eseguendo il seguente 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. Creare la funzione attrep\_intercept\_ddl eseguendo il seguente 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 si è effettuato l'accesso con un account non privilegiato, uscire dall'account non privilegiato e accedere con un account a cui è stato assegnato il ruolo di superuser (o il ruolo rds\_superuser quando si lavora con Amazon Aurora o Amazon RDS).

   Nota informatica

   Se la procedura archiviata attrep\_intercept\_ddl non viene creata nello schema predefinito, è necessario specificare il nome dello schema nel campo Crea artefatti DDL nello schema nelle impostazioni del connettore PostgreSQL.

   Per ulteriori informazioni sui parametri di configurazione della replica, vedere la Guida di PostgreSQL.

5. Creare il trigger dell'evento attrep\_intercept\_ddl eseguendo il seguente comando:

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

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

6. Concedere le seguenti autorizzazioni all'account non privilegiato:

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

   * Quando si utilizza PostgreSQL locale, Microsoft Azure Database per PostgreSQL, Google Cloud SQL per PostgreSQL o Google Cloud AlloyDB per PostgreSQL, concedere la seguente autorizzazione:

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

   * Quando si utilizza Amazon RDS per PostgreSQL o Amazon Aurora, concedere la seguente autorizzazione:

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

7. Concedere l'autorizzazione SELECT all'utente:

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

8. Concedere l'utilizzo dello schema all'utente:

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