【发布时间】:2010-10-17 01:14:34
【问题描述】:
如何防止触发器递归执行?假设我想在会计科目表上构建一个“可树”的描述。所以我所做的是当插入/更新一条新记录时,我会更新父记录的down_qty,所以这会递归地触发更新触发器。
现在,我的代码没问题 - 我把它放在 UPDATE 触发器的第一行:
-- prevents recursive trigger
if new.track_recursive_trigger <> old.track_recursive_trigger then
return new;
end if;
当我需要更新父记录的数量时,这是我的触发器中的示例代码:
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。
[编辑]
我在树内循环,我需要将每个account_category 的down_qty 冒泡回到它的根。例如,我插入一个新的帐户类别,它需要增加其父account_category的down_qty,同样当我更改帐户类别的父account_category时,我需要减少account_category的down_qty' s 以前的父母account_category。虽然我认为可以,但我不会让 PostgreSQL 执行递归触发器。我之前使用 MSSQL,触发递归深度级别仅限于 16 级别。
【问题讨论】:
-
我认为你应该更详细地解释一下,因为据我所知,这里没有递归调用的危险,除非你有:记录是它自己的父级,或者循环你的树(那不是树)。
标签: postgresql recursion