Från den fina manualen:
36.1. Översikt över triggerbeteende
[...]
För en utlösare på radnivå inkluderar indata ävenNEWrad förINSERTochUPDATEutlösare och/ellerOLDrad förUPDATEochDELETEutlö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/UPDATEoperationer i utlösare på radnivå. Denna variabel ärNULLi utlösare på satsnivå och förDELETEoperationer.
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
NULLeller 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 aktiveradesAFTEReller en utlösare på statement-nivå aktiveradBEFOREellerAFTERignoreras 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; .