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 leNEW
ligne pourINSERT
etUPDATE
déclencheurs, et/ou leOLD
ligne pourUPDATE
etDELETE
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éesRECORD
; variable contenant la nouvelle ligne de la base de données pourINSERT
/UPDATE
opérations dans les déclencheurs de niveau ligne. Cette variable estNULL
dans les déclencheurs au niveau de l'instruction et pourDELETE
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
ouAFTER
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;
.