Ответ 1
36,1. Обзор поведения триггеров
[...]
Для триггера уровня уровня входные данные также включают строкуNEW
для триггеровINSERT
иUPDATE
и/или строкуOLD
для триггеровUPDATE
иDELETE
. Триггеры уровня уровня не имеют способа изучить отдельные строки, измененные оператором.
И из Триггерные процедуры:
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;
.