Triggers

Row, statement, CONSTRAINT, and transition-table triggers declared in the TRIGGERS block.

Triggers are declared in the TRIGGERS { } block inside a table’s { }.

BEFORE INSERT row trigger

TABLE users ( ... )
{
    TRIGGERS {
        before_insert BEFORE INSERT
            FOR EACH ROW
            EXECUTE FUNCTION set_defaults();
    }
}
-- emits
CREATE TRIGGER "before_insert"
    BEFORE INSERT ON "public"."users"
    FOR EACH ROW
    EXECUTE FUNCTION set_defaults();

AFTER UPDATE OF specific columns

TRIGGERS {
    after_email_change AFTER UPDATE OF email
        FOR EACH ROW
        WHEN (OLD.email IS DISTINCT FROM NEW.email)
        EXECUTE FUNCTION notify_email_change();
}
CREATE TRIGGER "after_email_change"
    AFTER UPDATE OF "email" ON "public"."users"
    FOR EACH ROW
    WHEN (OLD.email IS DISTINCT FROM NEW.email)
    EXECUTE FUNCTION notify_email_change();

Statement-level trigger with transition tables

TRIGGERS {
    audit_changes AFTER INSERT OR UPDATE OR DELETE
        REFERENCING OLD TABLE AS old_rows NEW TABLE AS new_rows
        FOR EACH STATEMENT
        EXECUTE FUNCTION audit_table_changes();
}
CREATE TRIGGER "audit_changes"
    AFTER INSERT OR UPDATE OR DELETE ON "public"."users"
    REFERENCING OLD TABLE AS old_rows NEW TABLE AS new_rows
    FOR EACH STATEMENT
    EXECUTE FUNCTION audit_table_changes();

CONSTRAINT trigger

TRIGGERS {
    check_ref CONSTRAINT AFTER INSERT OR UPDATE
        FROM orders
        DEFERRABLE INITIALLY DEFERRED
        FOR EACH ROW
        EXECUTE FUNCTION check_ref_integrity();
}
CREATE CONSTRAINT TRIGGER "check_ref"
    AFTER INSERT OR UPDATE ON "public"."users"
    FROM "orders"
    DEFERRABLE INITIALLY DEFERRED
    FOR EACH ROW
    EXECUTE FUNCTION check_ref_integrity();

Trigger change behaviour

  • Adding a trigger: CREATE TRIGGER — SAFE.
  • Changing any trigger property: DROP TRIGGER + CREATE TRIGGER — CAUTION.
  • Removing a trigger: DROP TRIGGER — CAUTION (whatever the trigger enforced stops).