# Süper kullanıcı rolü olmadan bir hesabı kullanma

superuser rolüne (veya Amazon Aurora ya da Amazon RDS ile çalışırken rds\_superuser rolüne) sahip bir hesap kullanmıyorsanız Veri Tanımlama Dili (DDL) olaylarını yakalamak için birkaç nesne oluşturmanız gerekir. Bu nesneleri seçilen hesapta oluşturun ve ardından ana kullanıcı hesabında bir tetikleyici oluşturun.

Bilgi notuPostgreSQL için Google Cloud SQL ile superuser rolüne sahip bir hesap kullanmak üzere Data Movement gateway 2024.11.14 veya sonraki sürümü gerekir.

Bunu yapmak için:

1. Nesnelerin oluşturulmasını istediğiniz bir şema seçin. Varsayılan şema geneldir. Şemanın var olduğundan ve ayrıcalıklı olmayan hesap tarafından erişilebilir olduğundan emin olun.

2. Aşağıdaki komutu çalıştırarak attrep\_ddl\_audit tablosunu oluşturun:

   ```
   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. Aşağıdaki komutu çalıştırarak attrep\_intercept\_ddl fonksiyonunu oluşturun:

   ```
   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. Ayrıcalıklı olmayan bir hesapla oturum açtıysanız ayrıcalıklı olmayan hesaptan çıkın ve kendisine superuser rolü (veya Amazon Aurora ya da Amazon RDS ile çalışırken rds\_superuser rolü) atanmış bir hesapla oturum açın.

   Bilgi notu

   attrep\_intercept\_ddl saklı prosedürü varsayılan şemada oluşturulmuyorsa PostgreSQL bağlayıcı ayarlarındaki Şemada DDL yapıtları oluştur alanında şema adını belirtmeniz gerekir.

   Çoğaltma yapılandırma parametreleriyle ilgili daha fazla bilgi edinmek için bkz. PostgreSQL Yardımı.

5. Aşağıdaki komutu çalıştırarak attrep\_intercept\_ddl olay tetikleyicisini oluşturun:

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

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

6. Ayrıcalıklı olmayan hesaba aşağıdaki izinleri verin:

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

   * Şirket içinde PostgreSQL, PostgreSQL için Microsoft Azure Veritabanı, PostgreSQL için Google Cloud SQL veya PostgreSQL için Google Cloud AlloyDB ile çalışırken aşağıdaki izni verin:

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

   * PostgreSQL için Amazon RDS veya Amazon Aurora ile çalışırken aşağıdaki izni verin:

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

7. Kullanıcıya SELECT izni verin:

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

8. Kullanıcıya şema üzerinde kullanım izni verin:

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