作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个表 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/
我是一名优秀的程序员,十分优秀!