Zu Hauptinhalt springen

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

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

    • 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. Erteilen Sie dem Benutzer die Berechtigung SELECT:

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

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

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

Hat diese Seite Ihnen geholfen?

Wenn Sie Probleme mit dieser Seite oder ihren Inhalten feststellen – einen Tippfehler, einen fehlenden Schritt oder einen technischen Fehler –, teilen Sie uns bitte mit, wie wir uns verbessern können!