Uit de fijne handleiding:
36.1. Overzicht van triggergedrag
[...]
Voor een trigger op rijniveau bevatten de invoergegevens ook deNEWrij voorINSERTenUPDATEtriggers, en/of deOLDrij voorUPDATEenDELETEtriggers. 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/UPDATEbewerkingen in triggers op rijniveau. Deze variabele isNULLin triggers op instructieniveau en voorDELETEoperaties.
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 dieAFTERis geactiveerd of een trigger op instructieniveau isBEFOREofAFTERwordt 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; .