Пример для каждого элемента запуска

Я смотрел документацию триггеров postgresql, но, похоже, он показывает только примеры триггеров на уровне строк, но я не могу найти пример для триггера уровня инструкции.

В частности, не совсем понятно, как выполнять итерацию в обновленных/вставленных строках в одном выражении, так как NEW для одной записи.

Ответ 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();