gpt4 book ai didi

sql - 如何避免在此 FOR EACH STATEMENT 触发器中无限递归?

转载 作者:行者123 更新时间:2023-11-29 14:15:41 25 4
gpt4 key购买 nike

我有一个表 tbl,它有一个 dirty: boolean 列。在交易期间,对于某些行,此标志设置为 true。然后,我有以下触发器:

create function tbl_process() returns trigger as
$$ begin
-- first, do something for all rows with dirty flag set to true
...

-- then, reset the dirty flag
update tbl set dirty = false where dirty = true;

return null;
end $$ language plpgsql;

create trigger tbl_process after update on tbl for each statement execute procedure tbl_process();

这里的问题是第二个查询(update tbl set dirty = false where dirty = true)递归调用触发器。这一直持续到我们得到堆栈溢出。

有没有办法避免这种情况?而且,为什么我们会遇到递归?在第一次迭代中,我们将所有行标记为 dirty = false,因此在第二次迭代中,不应该有 dirty = true?

的行

我正在使用 PostgreSQL 9.6。

最佳答案

在函数体的开头添加下面的语句

IF pg_trigger_depth() <> 1 THEN
RETURN NEW;
END IF;

喜欢

create function tbl_process() returns trigger as
$$ begin
IF pg_trigger_depth() <> 1 THEN
RETURN NEW;
END IF;
update tbl set dirty = false where dirty = true;

return null;
end $$ language plpgsql;

关于sql - 如何避免在此 FOR EACH STATEMENT 触发器中无限递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48702802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com