У меня есть триггерная функция, которая просто отправляет уведомление на канал, когда что-то происходит, например, когда я добавляю новую запись в таблицу. Мой код функции:
create function public.notify()
returns trigger
language 'plpgsql'
as $$
begin
notify "demo_channel";
return null;
end;
$$;
Затем я создаю триггер, используя следующий код:
create trigger tr_demo
after insert
on public.tb_demo
for each row
execute procedure public.notify();
Все работает как часы, и каждый раз, когда добавляется новая строка, мой Python-скрипт psycopg2 обнаруживает уведомление в режиме реального времени и делает что-то на его основе. Проблема в том, что я хочу, чтобы мой триггер выполнял то же действие при обновлении существующей строки, поэтому я изменил вторую строку своего триггера на:
after insert or update
К сожалению, если я делаю это, каждый раз, когда я ДОБАВЛЯЮ запись, уведомление переходит в бесконечные циклы, бесконечно повторяя это действие, что делает программу бесполезной. Использование после вставки удаления работает просто отлично.
Что такого особенного в использовании update в триггере (в идеале у меня было бы предложение after insert или update или delete, чтобы перехватывать любую операцию в таблице), что это выводит мой код из-под контроля? Спасибо!