От финото ръководство:
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;
.