OLD
e NEW
sono nulli o non definiti in un trigger a livello di istruzione. Per documentazione:
Enfasi in grassetto la mia.
Fino a Postgres 10 questa lettura era leggermente diversa, con lo stesso effetto, però:
Sebbene queste variabili di record non siano ancora utili per i trigger a livello di istruzione, una novità assoluta è:
Tabelle di transizione in Postgres 10+
Postgres 10 ha introdotto le tabelle di transizione. Quelli consentono l'accesso all'intero set di righe interessate. Il manuale:
Segui il link al manuale per esempi di codice.
Esempio di trigger a livello di istruzione senza tabelle di transizione
Prima dell'avvento delle tabelle di transizione, queste erano ancora meno comuni. Un esempio utile è inviare notifiche
dopo alcuni comandi DML.
Ecco una versione base di ciò che uso:
-- Generic trigger function, can be used for multiple triggers:
CREATE OR REPLACE FUNCTION trg_notify_after()
RETURNS trigger
LANGUAGE plpgsql AS
$func$
BEGIN
PERFORM pg_notify(TG_TABLE_NAME, TG_OP);
RETURN NULL;
END
$func$;
-- Trigger
CREATE TRIGGER notify_after
AFTER INSERT OR UPDATE OR DELETE ON my_tbl
FOR EACH STATEMENT
EXECUTE PROCEDURE trg_notify_after();
Per Postgres 11 o versioni successive usa la sintassi equivalente e meno confusa:
...
EXECUTE FUNCTION trg_notify_after();
Vedi: