如何防止触发器的递归执行?假设我想在帐户表上构造一个“tree-able”的描述。所以,当插入/更新新记录时,我更新父记录的down_qty
,因此这将递归地触发更新触发器。
现在,我的代码没问题-我把这个UPDATE
触发器的第一行:
-- prevents recursive trigger
if new.track_recursive_trigger <> old.track_recursive_trigger then
return new;
end if;
当我需要更新父记录的qty时,这是我触发器中的示例代码:
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
。
发布于 2018-03-30 09:39:23
在PG中,应该由您跟踪触发器递归。
如果触发器函数执行SQL命令,那么这些命令可能再次触发触发器。这就是所谓的级联触发器。级联级的数量没有直接限制。级联可能导致递归调用同一触发器;例如,INSERT触发器可能执行命令,将额外的行插入到同一表中,从而导致再次触发INSERT触发器。在这种情况下避免无限递归是触发程序员的责任。
http://www.postgresql.org/docs/8.3/static/trigger-definition.html
发布于 2018-03-30 10:16:24
有一个函数pg_trigger_depth()
,用于区分触发器中的原始调用和嵌套调用。
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()
https://stackoverflow.com/questions/-100003744
复制相似问题