【问题标题】:How do I prevent Trigger recursion in SQLite?如何防止 SQLite 中的触发器递归?
【发布时间】:2012-01-12 11:10:42
【问题描述】:

我正在尝试创建一个触发器,该触发器将更新成绩已更新的学生的所有朋友的成绩。

create trigger upgrade
after update on Highschooler
when new.grade=old.grade+1 and trigger_nestlevel() < 2
begin
    update Highschooler
    set grade=new.grade
    where ID in (
      select ID2
      from Friend
       where ID1=old.ID
    )
;
end

等级提高的人的朋友的朋友(朋友...)也正在“升级”我该如何阻止这种情况?

【问题讨论】:

    标签: sql sqlite recursion triggers


    【解决方案1】:

    正如您在Limits In SQLite 中看到的,您可以使用 PRAGMA recursive_triggers 语句清除递归触发功能。

    10.触发递归的最大深度

    SQLite 限制了触发器的递归深度,以防止 涉及使用无限量的递归触发器的语句 内存。

    在 SQLite 版本 3.6.18 之前,触发器不是递归的,因此 这个限制是没有意义的。从版本 3.6.18 开始,递归 支持触发器,但必须使用 PRAGMA recursive_triggers 声明。从版本 3.7.0 开始, 递归触发器默认启用,但可以手动禁用 使用PRAGMA recursive_triggers。 SQLITE_MAX_TRIGGER_DEPTH 只是 如果启用了递归触发器,则有意义。

    默认的最大触发递归深度为 1000。

    【讨论】:

      猜你喜欢
      • 2010-10-17
      • 2010-12-04
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多