От финото ръководство:
36.1. Преглед на поведението на тригера
[...]
За тригер на ниво ред, входните данни включват същоNEWред заINSERTиUPDATEтригери и/илиOLDред заUPDATEиDELETEтригери. Задействанията на ниво оператор понастоящем нямат начин да проверят отделните редове, модифицирани от оператора.
И от Trigger Procedures:
NEW
Тип данниRECORD; променлива, съдържаща новия ред на базата данни заINSERT/UPDATEоперации в тригери на ниво ред. Тази променлива еNULLв тригери на ниво израз и заDELETEоперации.
Обърнете внимание какво казва за тригерите на ниво ред и задействанията на ниво израз.
Имате тригер на ниво оператор:
...
FOR EACH STATEMENT
EXECUTE PROCEDURE f_log_datei();
Тригерите на ниво израз се задействат веднъж на изявление и даден израз може да се прилага към множество реда, така че понятието засегнат ред (което е NEW и OLD са за) просто не се прилага.
Ако искате да използвате NEW (или OLD ) в задействане, тогава искате тригерът да се изпълни за всеки засегнат ред и това означава, че искате задействане на ниво ред:
CREATE TRIGGER log_datei AFTER INSERT OR UPDATE OR DELETE
ON dateien
FOR EACH ROW
EXECUTE PROCEDURE f_log_datei();
Току-що промених FOR EACH STATEMENT към FOR EACH ROW .
Вашият тригер също трябва да връща нещо:
Функцията за задействане трябва да върне или
NULLили стойност на запис/ред, имаща точно структурата на таблицата, за която е задействан тригерът.
[...]
Върнатата стойност на тригер на ниво ред, задействанAFTERили тригер на ниво израз, задействанBEFOREилиAFTERвинаги се игнорира; може и да е нула. Въпреки това, всеки от тези типове задействания все пак може да прекъсне цялата операция, като изведе грешка.
Така че трябва да RETURN NEW; или RETURN NULL; във вашия спусък. Имате спусък AFTER, така че няма значение кое RETURN използвате, но аз бих използвал RETURN NEW; .