PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Acionador do Postgres após inserir acessando NOVO


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 o NEW linha para INSERT e UPDATE gatilhos e/ou o OLD linha para UPDATE e DELETE 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 dados RECORD; variável que contém a nova linha do banco de dados para INSERT /UPDATE operações em gatilhos em nível de linha. Esta variável é NULL em gatilhos de nível de instrução e para DELETE 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 retornar NULL 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 acionado AFTER ou um gatilho de nível de instrução disparado BEFORE ou AFTER é 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; .