Event Triggers

EVENT TRIGGER declarations that fire on DDL events.

Event triggers are database-level (not cluster-level) and fire on DDL events. They are declared at the top level of a .dpg file (not inside a schema block).

Basic event trigger

EVENT TRIGGER prevent_drop_table
    ON sql_drop
    WHEN TAG IN ('DROP TABLE', 'DROP SCHEMA')
    EXECUTE FUNCTION abort_drop();
-- emits
CREATE EVENT TRIGGER "prevent_drop_table"
    ON sql_drop
    WHEN TAG IN ('DROP TABLE', 'DROP SCHEMA')
    EXECUTE FUNCTION abort_drop();

ddl_command_start trigger

EVENT TRIGGER audit_ddl
    ON ddl_command_start
    EXECUTE FUNCTION log_ddl_start();
-- emits
CREATE EVENT TRIGGER "audit_ddl"
    ON ddl_command_start
    EXECUTE FUNCTION log_ddl_start();

Available events

EventFires when
ddl_command_startBefore any DDL command executes
ddl_command_endAfter any DDL command completes
sql_dropBefore objects are dropped
table_rewriteBefore a table is rewritten
login (PostgreSQL 17+)Once per authenticated connection, before the session’s first query — WHEN TAG IN (...) doesn’t apply (no command tag to filter on)

Diffing behaviour

ChangeSQLSafety
New event triggerCREATE EVENT TRIGGERSAFE
Event/WHEN TAG IN/function changedDROP EVENT TRIGGER + CREATE EVENT TRIGGERSAFE (no data involved)
Enable state changed onlyALTER EVENT TRIGGER ENABLE/DISABLE (or ENABLE REPLICA/ENABLE ALWAYS)SAFE
Owner changedALTER EVENT TRIGGER OWNER TOSAFE
Renamed (RENAMED FROM)ALTER EVENT TRIGGER RENAME TOCAUTION
Removed event triggerDROP EVENT TRIGGERSAFE