PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Déclencheur Postgres après l'insertion de l'accès à NEW

Extrait du bon manuel :

36.1. Présentation du comportement du déclencheur
[...]
Pour un déclencheur au niveau de la ligne, les données d'entrée incluent également le NEW ligne pour INSERT et UPDATE déclencheurs, et/ou le OLD ligne pour UPDATE et DELETE déclencheurs. Les déclencheurs au niveau de l'instruction n'ont actuellement aucun moyen d'examiner les lignes individuelles modifiées par l'instruction.

Et depuis Trigger Procedures :

NEW
Type de données RECORD; variable contenant la nouvelle ligne de la base de données pour INSERT /UPDATE opérations dans les déclencheurs de niveau ligne. Cette variable est NULL dans les déclencheurs au niveau de l'instruction et pour DELETE opérations.

Notez ce qu'il dit sur les déclencheurs au niveau de la ligne et les déclencheurs au niveau de l'instruction.

Vous disposez d'un déclencheur au niveau de l'instruction :

...
FOR EACH STATEMENT
EXECUTE PROCEDURE f_log_datei();

Les déclencheurs au niveau de l'instruction sont déclenchés une fois par instruction et une instruction peut s'appliquer à plusieurs lignes, de sorte que la notion de ligne affectée (c'est quoi NEW et OLD sont environ) ne s'applique tout simplement pas.

Si vous souhaitez utiliser NEW (ou OLD ) dans un déclencheur, vous souhaitez que le déclencheur s'exécute pour chaque ligne affectée, ce qui signifie que vous souhaitez un déclencheur au niveau de la ligne :

CREATE TRIGGER log_datei AFTER INSERT OR UPDATE OR DELETE
ON dateien
FOR EACH ROW
EXECUTE PROCEDURE f_log_datei();

Je viens de changer FOR EACH STATEMENT à FOR EACH ROW .

Votre déclencheur devrait également renvoyer quelque chose :

Une fonction déclencheur doit renvoyer soit NULL ou une valeur d'enregistrement/ligne ayant exactement la structure de la table pour laquelle le déclencheur a été déclenché.
[...]
La valeur de retour d'un déclencheur de niveau ligne déclenché AFTER ou un déclencheur au niveau de l'instruction lancé BEFORE ou AFTER est toujours ignoré ; il pourrait tout aussi bien être nul. Cependant, n'importe lequel de ces types de déclencheurs peut toujours interrompre l'intégralité de l'opération en générant une erreur.

Vous devez donc RETURN NEW; ou RETURN NULL; dans votre déclencheur. Vous avez un déclencheur AFTER donc peu importe le RETURN que vous utilisez mais j'irais avec RETURN NEW; .