Uit de fijne handleiding:
36.1. Overzicht van triggergedrag
[...]
Voor een trigger op rijniveau bevatten de invoergegevens ook deNEW
rij voorINSERT
enUPDATE
triggers, en/of deOLD
rij voorUPDATE
enDELETE
triggers. Triggers op instructieniveau hebben momenteel geen manier om de individuele rij(en) te onderzoeken die door de instructie zijn gewijzigd.
En van triggerprocedures:
NEW
GegevenstypeRECORD
; variabele met de nieuwe databaserij voorINSERT
/UPDATE
bewerkingen in triggers op rijniveau. Deze variabele isNULL
in triggers op instructieniveau en voorDELETE
operaties.
Let op wat er staat over triggers op rijniveau en triggers op instructieniveau.
Je hebt een trigger op statement-niveau:
...
FOR EACH STATEMENT
EXECUTE PROCEDURE f_log_datei();
Triggers op instructieniveau worden één keer per instructie geactiveerd en een instructie kan van toepassing zijn op meerdere rijen, dus het begrip betrokken rij (dat is wat NEW
en OLD
zijn over) is gewoon niet van toepassing.
Als u NEW
. wilt gebruiken (of OLD
) in een trigger, dan wilt u dat de trigger wordt uitgevoerd voor elke betrokken rij en dat betekent dat u een trigger op rijniveau wilt:
CREATE TRIGGER log_datei AFTER INSERT OR UPDATE OR DELETE
ON dateien
FOR EACH ROW
EXECUTE PROCEDURE f_log_datei();
Ik heb zojuist FOR EACH STATEMENT
changed gewijzigd naar FOR EACH ROW
.
Je trigger zou ook iets moeten retourneren:
Een triggerfunctie moet ofwel
NULL
. teruggeven of een record-/rijwaarde met exact de structuur van de tabel waarvoor de trigger is geactiveerd.
[...]
De retourwaarde van een trigger op rijniveau dieAFTER
is geactiveerd of een trigger op instructieniveau isBEFORE
ofAFTER
wordt altijd genegeerd; het kan net zo goed nul zijn. Elk van deze typen triggers kan echter nog steeds de hele bewerking afbreken door een fout te veroorzaken.
Dus je moet RETURN NEW;
of RETURN NULL;
in je trekker. Je hebt een AFTER-trigger, dus het maakt niet uit welke RETURN je gebruikt, maar ik zou kiezen voor RETURN NEW;
.