Från den fina manualen:
36.1. Översikt över triggerbeteende
[...]
För en utlösare på radnivå inkluderar indata ävenNEW
rad förINSERT
ochUPDATE
utlösare och/ellerOLD
rad förUPDATE
ochDELETE
utlösare. Utlösare på uttalandenivå har för närvarande inget sätt att undersöka de individuella raderna som ändrats av uttalandet.
Och från Trigger Procedures:
NEW
DatatypRECORD
; variabel som innehåller den nya databasraden förINSERT
/UPDATE
operationer i utlösare på radnivå. Denna variabel ärNULL
i utlösare på satsnivå och förDELETE
operationer.
Notera vad det står om utlösare på radnivå och utlösare på uttalandenivå.
Du har en utlösare på uttalandenivå:
...
FOR EACH STATEMENT
EXECUTE PROCEDURE f_log_datei();
Utlösare på påståendenivå utlöses en gång per påstående och ett påstående kan tillämpas på flera rader så begreppet berörd rad (vilket är NEW
och OLD
är om) gäller helt enkelt inte.
Om du vill använda NEW
(eller OLD
) i en utlösare vill du att utlösaren ska köras för varje påverkad rad och det betyder att du vill ha en utlösare på radnivå:
CREATE TRIGGER log_datei AFTER INSERT OR UPDATE OR DELETE
ON dateien
FOR EACH ROW
EXECUTE PROCEDURE f_log_datei();
Jag ändrade precis FOR EACH STATEMENT
till FOR EACH ROW
.
Din trigger bör också returnera något:
En triggerfunktion måste returnera antingen
NULL
eller ett post-/radvärde som har exakt strukturen för tabellen som utlösaren aktiverades för.
[...]
Returvärdet för en utlösare på radnivå som aktiveradesAFTER
eller en utlösare på statement-nivå aktiveradBEFORE
ellerAFTER
ignoreras alltid; det kan lika gärna vara null. Men någon av dessa typer av utlösare kan fortfarande avbryta hela operationen genom att visa ett fel.
Så du bör RETURN NEW;
eller RETURN NULL;
i din trigger. Du har en AFTER-utlösare så det spelar ingen roll vilken RETURN du använder men jag skulle gå med RETURN NEW;
.