OLD
e NEW
são nulos ou não definidos em um gatilho de nível de instrução. Por documentação:
Minha ênfase em negrito.
Até o Postgres 10, isso era um pouco diferente, com o mesmo efeito:
Embora essas variáveis de registro ainda não sejam úteis para gatilhos de nível de instrução, um novo recurso é:
Tabelas de transição no Postgres 10+
O Postgres 10 introduziu tabelas de transição. Esses permitem o acesso a todo o conjunto de linhas afetadas. O manual:
Siga o link para o manual para exemplos de código.
Exemplo de gatilho em nível de instrução sem tabelas de transição
Antes do advento das tabelas de transição, elas eram ainda menos comuns. Um exemplo útil é enviar notificações após certos comandos DML.
Aqui está uma versão básica do que eu 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 o Postgres 11 ou posterior, use a sintaxe equivalente e menos confusa:
...
EXECUTE FUNCTION trg_notify_after();
Ver: