Postgres прослушивает бесконечный цикл в триггере обновления

У меня есть триггерная функция, которая просто отправляет уведомление на канал, когда что-то происходит, например, когда я добавляю новую запись в таблицу. Мой код функции:

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, чтобы перехватывать любую операцию в таблице), что это выводит мой код из-под контроля? Спасибо!


person Chris    schedule 24.09.2020    source источник


Ответы (2)


В UPDATE нет ничего особенного. Проблема должна быть связана с частью вашего кода, которую вы нам не показали.

Например, если ваш код Python отвечает на уведомление, обновляя строку в tb_demo, то очевидно, что это обновление вызовет другое уведомление, которое вызовет другое обновление и т. д.

person jjanes    schedule 24.09.2020
comment
конечно... как глупо было не осознавать, что я обновляю статус строки в той же самой таблице каждый раз, когда происходит изменение. теперь это проблема бизнес-логики, а не проблема БД. Спасибо! - person Chris; 25.09.2020

Я обновлял рассматриваемые записи, запуская бесконечный цикл обновления -> триггер -> обновление. Фиксированный.

person Chris    schedule 24.09.2020