Ответ 1
OLD
и NEW
имеют значение null или не определены в триггере уровня оператора. По документации:
NEW
Тип данных
RECORD
; переменная, содержащая новую строку базы данных для операцийINSERT
/UPDATE
в триггерах уровня строки. Эта переменная равна нулю в триггерах уровня оператора и для операцийDELETE
.
OLD
Тип данных ЗАПИСЬ; переменная, содержащая старую строку базы данных для операций
UPDATE
/DELETE
в триггерах уровня строки. Эта переменная равна нулю в триггерах уровня оператора и для операцийINSERT
.
Жирный акцент мой.
До Postgres 10 это читалось немного по-другому, но с тем же эффектом:
... Эта переменная не присваивается в триггерах уровня оператора....
Хотя эти переменные записи по-прежнему бесполезны для триггеров уровня оператора, новая функция очень важна:
Таблицы переходов в Postgres 10+
Postgres 10 представил таблицы переходов. Они позволяют получить доступ ко всему набору затронутых строк. Руководство:
AFTER
также могут использовать таблицы переходов для проверки всего набора строк, измененных оператором запуска. КомандаCREATE TRIGGER
назначает имена одной или обеим таблицам переходов, и затем функция может ссылаться на эти имена, как если бы они были временными таблицами только для чтения. Пример 43.7 показывает пример.
Перейдите по ссылке на руководство для примеров кода.
Пример триггера уровня оператора без таблиц переходов
До появления таблиц переходов они были еще менее распространены. Полезный пример - отправка уведомлений после определенных команд DML.
Вот базовая версия того, что я использую:
-- Generic trigger function, can be used for multiple triggers:
CREATE OR REPLACE FUNCTION trg_notify_after()
RETURNS trigger AS
$func$
BEGIN
PERFORM pg_notify(TG_TABLE_NAME, TG_OP);
RETURN NULL;
END
$func$ LANGUAGE plpgsql;
-- Trigger
CREATE TRIGGER notify_after
AFTER INSERT OR UPDATE OR DELETE ON my_tbl
FOR EACH STATEMENT
EXECUTE PROCEDURE trg_notify_after();