Do manual fino:
36,1. Visão geral do comportamento do acionador
[...]
Para um acionador em nível de linha, os dados de entrada também incluem oNEWlinha paraINSERTeUPDATEgatilhos e/ou oOLDlinha paraUPDATEeDELETEgatilhos. No momento, os acionadores de nível de instrução não têm como examinar as linhas individuais modificadas pela instrução.
E de Procedimentos de Gatilho:
NEW
Tipo de dadosRECORD; variável que contém a nova linha do banco de dados paraINSERT/UPDATEoperações em gatilhos em nível de linha. Esta variável éNULLem gatilhos de nível de instrução e paraDELETEoperações.
Observe o que ele diz sobre gatilhos em nível de linha e gatilhos em nível de instrução.
Você tem um gatilho em nível de instrução:
...
FOR EACH STATEMENT
EXECUTE PROCEDURE f_log_datei();
Os gatilhos em nível de instrução são acionados uma vez por instrução e uma instrução pode ser aplicada a várias linhas, de modo que a noção de linha afetada (que é o que
NEW e OLD são sobre) simplesmente não se aplica. Se você quiser usar
NEW (ou OLD ) em um gatilho, você deseja que o gatilho seja executado para cada linha afetada e isso significa que você deseja um gatilho em nível de linha:CREATE TRIGGER log_datei AFTER INSERT OR UPDATE OR DELETE
ON dateien
FOR EACH ROW
EXECUTE PROCEDURE f_log_datei();
Acabei de alterar
FOR EACH STATEMENT para FOR EACH ROW . Seu gatilho também deve estar retornando algo:
Uma função de gatilho deve retornarNULLou um valor de registro/linha tendo exatamente a estrutura da tabela para a qual o gatilho foi acionado.
[...]
O valor de retorno de um gatilho em nível de linha acionadoAFTERou um gatilho de nível de instrução disparadoBEFOREouAFTERé sempre ignorado; também pode ser null. No entanto, qualquer um desses tipos de gatilhos ainda pode abortar toda a operação gerando um erro.
Então você deve
RETURN NEW; ou RETURN NULL; no seu gatilho. Você tem um gatilho AFTER, então não importa qual RETURN você usa, mas eu usaria RETURN NEW; .