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 oNEW
linha paraINSERT
eUPDATE
gatilhos e/ou oOLD
linha paraUPDATE
eDELETE
gatilhos. 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
/UPDATE
operações em gatilhos em nível de linha. Esta variável éNULL
em gatilhos de nível de instrução e paraDELETE
operaçõ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 retornarNULL
ou 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 acionadoAFTER
ou um gatilho de nível de instrução disparadoBEFORE
ouAFTER
é 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;
.