如何防止SQLite中的Trigger递归?

时间:2011-12-04 03:16:41

标签: sql sqlite recursion triggers

我正在尝试创建一个触发器,用于更新等级更新的学生的所有朋友的成绩。

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

朋友的朋友(朋友......)等级增加的人也正在“升级”我怎么能阻止这个?

1 个答案:

答案 0 :(得分:3)

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

  

<强> 10。最大触发递归深度

     

SQLite限制触发器的递归深度以防止a   涉及使用无限金额的递归触发器的语句   记忆。

     

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

     

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