首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何防止PostgreSQL中的递归触发器?

如何防止PostgreSQL中的递归触发器?
EN

Stack Overflow用户
提问于 2018-03-30 00:48:49
回答 2查看 0关注 0票数 0

如何防止触发器的递归执行?假设我想在帐户表上构造一个“tree-able”的描述。所以,当插入/更新新记录时,我更新父记录的down_qty,因此这将递归地触发更新触发器。

现在,我的代码没问题-我把这个UPDATE触发器的第一行:

代码语言:txt
复制
-- prevents recursive trigger
if new.track_recursive_trigger <> old.track_recursive_trigger then
    return new;
end if;

当我需要更新父记录的qty时,这是我触发器中的示例代码:

代码语言:txt
复制
update account_category set 
    track_recursive_trigger = track_recursive_trigger + 1, -- i put this line to prevent recursive trigger
    down_qty = down_qty - (old.down_qty + 1)
where account_category_id = m_parent_account;

我在想,如果PostgreSQL中有一种检测递归触发器的方法,而不引入一个新的字段,类似于MSSQL的trigger_nestlevel

EN

回答 2

Stack Overflow用户

发布于 2018-03-30 09:39:23

在PG中,应该由您跟踪触发器递归。

如果触发器函数执行SQL命令,那么这些命令可能再次触发触发器。这就是所谓的级联触发器。级联级的数量没有直接限制。级联可能导致递归调用同一触发器;例如,INSERT触发器可能执行命令,将额外的行插入到同一表中,从而导致再次触发INSERT触发器。在这种情况下避免无限递归是触发程序员的责任。

http://www.postgresql.org/docs/8.3/static/trigger-definition.html

票数 0
EN

Stack Overflow用户

发布于 2018-03-30 10:16:24

有一个函数pg_trigger_depth()用于区分触发器中的原始调用和嵌套调用。

代码语言:txt
复制
CREATE TRIGGER trg_taxonomic_positions
AFTER INSERT OR UPDATE OF taxonomic_position
ON taxon_concepts
FOR EACH ROW
WHEN (pg_trigger_depth() = 0)
EXECUTE PROCEDURE trg_taxonomic_positions()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100003744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档