OLD
y NEW
son nulos o no están definidos en un activador de nivel de declaración. Por documentación:
Énfasis en negrita mío.
Sin embargo, hasta Postgres 10 esto se lee ligeramente diferente, con el mismo efecto:
Si bien esas variables de registro aún no sirven para los disparadores de nivel de declaración, una nueva característica es:
Tablas de transición en Postgres 10+
Postgres 10 introdujo tablas de transición. Esos permiten el acceso a todo el conjunto de filas afectadas. El manual:
Siga el enlace al manual para ver ejemplos de código.
Ejemplo de desencadenador a nivel de declaración sin tablas de transición
Antes de la llegada de las tablas de transición, eran aún menos comunes. Un ejemplo útil es enviar notificaciones
después de ciertos comandos DML.
Aquí hay una versión básica de lo que 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();
Para Postgres 11 o posterior, use la sintaxis equivalente, menos confusa:
...
EXECUTE FUNCTION trg_notify_after();
Ver: