【问题标题】:postgres listen infinite loop in update triggerpostgres 在更新触发器中侦听无限循环
【发布时间】:2021-01-11 04:14:37
【问题描述】:

我有一个触发器函数,它只是在发生某些事情时向通道发送通知,例如当我将新记录添加到表中时。我的功能代码是:

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();

一切都像魅力一样工作,每次添加新行时,我的 psycopg2 Python 脚本都会“实时”检测到通知并基于此执行一些操作。问题是我希望我的触发器在更新现有行时也执行相同的操作,所以我将触发器的第二行更改为:

after insert or update

不幸的是,如果我这样做,每次添加记录时,通知都会进入无限循环,无休止地重复该动作,使程序无用。在插入删除之后使用就可以了。

在触发器中使用 update 有什么特别之处(理想情况下,我会有一个 after insert 或 update 或 delete 子句,以捕获对表的任何操作),它会使我的代码失控?谢谢!

【问题讨论】:

    标签: postgresql loops triggers notify listen


    【解决方案1】:

    UPDATE 没有什么特别之处。问题一定出在您没有向我们展示的代码部分。

    例如,如果您的python代码通过更新tb_demo中的一行来响应通知,那么显然该更新将触发另一个通知,这将触发另一个更新,等等。

    【讨论】:

    • 当然......我是多么愚蠢,我没有意识到每次发生变化时我都会更新同一个表中一行的状态。现在是业务逻辑问题,而不是数据库问题。谢谢!
    【解决方案2】:

    我正在更新有问题的记录,触发无限循环向上更新 -> 触发器 -> 更新。固定。

    【讨论】:

      猜你喜欢
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      • 2019-05-14
      • 2012-10-29
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多