Skip to Main Content

Oracle PL/SQL Einzel-Tipp ansehen

Hier sehen Sie unseren PL/SQL-Tipp „Event Trigger bei Postgres”.

Event Trigger bei Postgres

Tipp 113

  Thema: TRIGGER
  Datenbank-Version: 12.1, 12.2
  Erstellt am 10.12.19
  Bearbeitet am 10.12.19
Nicht nur Oracle besitzt DDL Trigger, diese gibt es auch in ähnlicher Form in der Postgres Datenbank

Folgende Events stehen derzeit zur Verfügung:
  • ddl_command_start (zündet vor Ausführung von ( CREATE, ALTER, DROP, SECURITY LABEL, COMMENT, GRANT oder REVOKE Befehlen)
  • ddl_command_end (zündet nach Ausführung von ( CREATE, ALTER, DROP, SECURITY LABEL, COMMENT, GRANT oder REVOKE Befehlen)
  • sql_drop (zündet bei allen Befehlen, die Objekte aus der Datenbank löschen)
  • table_rewrite (zündet vor rewrite Operationen wie ALTER TABLE oder ALTER TYPE)

Beispiel für einen ddl_command_end Trigger:
CREATE FUNCTION notice_event() RETURNS event_trigger AS $$
DECLARE r RECORD;
BEGIN
    FOR r IN SELECT * FROM pg_event_trigger_ddl_commands() LOOP
        RAISE NOTICE 'caught % event on %', r.command_tag, r.object_identity;
    END LOOP;
END;
$$
LANGUAGE plpgsql;

CREATE EVENT TRIGGER tr_notice_alter_table
  ON ddl_command_end WHEN TAG IN ('ALTER TABLE')
  EXECUTE PROCEDURE notice_event();
Beispiel für einen sql_drop Trigger in Postgres:
CREATE EVENT TRIGGER tr_notice_drop_table ON SQL_DROP
    WHEN TAG IN ('DROP TABLE')
    EXECUTE PROCEDURE public.notice_drop_event();

CREATE OR REPLACE FUNCTION notice_drop_event() RETURNS event_trigger AS $$
DECLARE r RECORD;
BEGIN
    FOR r IN SELECT * FROM pg_event_trigger_dropped_objects() LOOP
        RAISE NOTICE 'Schema:% Objekt:% Typ:% Original:%',  
        r.schema_name,r.object_name,r.object_type,r.original;
    END LOOP;
END;
$$
LANGUAGE plpgsql;
 
create table t (id int);
drop table t;

HINWEIS: Schema:public Objekt:t Typ:table Original:t
HINWEIS: Schema:public Objekt:t Typ:type Original:f
HINWEIS: Schema:public Objekt:_t Typ:type Original:f
DROP TABLE

Mögliche Return-Spalten der Funktion pg_event_trigger_dropped_objects():
  • classid (oid)
  • objid (oid)
  • objsubid (oid)
  • original (boolean) War es das Originalziel des Drop
  • normal (boolean)
  • is_temporary (boolean) War es ein temporäres Objekt
  • object_type (text) Objekttyp wie z.B. Tabelle, Index, Schema
  • schema_name (text) Schemaname
  • object_name (text) Objektname
  • object_identity (text)
  • address_names (text[])
  • address_args (text[])

Event Matrix für Postgres 12
Weitere spannende Postgres Beispiele erfahren Sie in unseren PG/SQL Kurs.

Wussten Sie schon, dass wir auch Schulungen zu Oracle PL/SQL anbieten?