Fra den fine manual:
36.1. Oversigt over Trigger Behavior
[...]
For en trigger på rækkeniveau inkluderer inputdata også NEW
række for INSERT
og UPDATE
triggere og/eller OLD
række for UPDATE
og DELETE
udløser. Udløsere på erklæringsniveau har i øjeblikket ingen mulighed for at undersøge den eller de individuelle rækker, der er ændret af erklæringen.
Og fra Trigger Procedures:
NEW
Datatype RECORD
; variabel, der indeholder den nye databaserække for INSERT
/UPDATE
operationer i udløsere på rækkeniveau. Denne variabel er NULL
i udløsere på statement-niveau og for DELETE
operationer.
Bemærk, hvad der står om udløsere på rækkeniveau og udløsere på udsagnsniveau.
Du har en trigger på erklæringsniveau:
...
FOR EACH STATEMENT
EXECUTE PROCEDURE f_log_datei();
Udløsere på erklæringsniveau udløses én gang pr. erklæring, og en erklæring kan gælde for flere rækker, så begrebet berørt række (hvilket er det NEW
og OLD
er omkring) gælder simpelthen ikke.
Hvis du vil bruge NEW
(eller OLD
) i en trigger, så ønsker du, at triggeren skal udføres for hver berørt række, og det betyder, at du vil have en trigger på rækkeniveau:
CREATE TRIGGER log_datei AFTER INSERT OR UPDATE OR DELETE
ON dateien
FOR EACH ROW
EXECUTE PROCEDURE f_log_datei();
Jeg har lige ændret FOR EACH STATEMENT
til FOR EACH ROW
.
Din trigger burde også returnere noget:
En triggerfunktion skal returnere enten NULL
eller en post-/rækkeværdi, der har nøjagtig strukturen af den tabel, triggeren blev udløst for.
[...]
Returværdien for en trigger på rækkeniveau udløst AFTER
eller en udløser på statement-niveau udløst BEFORE
eller AFTER
ignoreres altid; den kan lige så godt være nul. Enhver af disse typer triggere kan dog stadig afbryde hele operationen ved at rejse en fejl.
Så du bør RETURN NEW;
eller RETURN NULL;
i din trigger. Du har en AFTER-trigger, så det er ligegyldigt, hvilken RETURN du bruger, men jeg ville gå med RETURN NEW;
.