有没有办法阻止在删除和/或插入触发器中触发更新触发器?

时间:2014-10-13 19:46:36

标签: sqlite triggers

长话短说,在SQLite中,我有一个sortOrder字段,它可以处理表中项目的可变排序顺序。我有触发器:

Inesrt之后:如果>触发器将所有sortOrder字段更新+1。而不是插入的字段。

删除后:触发器将所有sortOrder字段更新为-1,如果它们是>比删除的那个字段。

更新(sortOrder)。这会在sortOrder字段中添加或减去,具体取决于数字是移动得高于还是低于其之前的位置。

现在问题。所有更新表设置sortOrder =触发On Update的任何内容。

那么有没有办法在其他触发功能期间关闭更新?

2 个答案:

答案 0 :(得分:0)

使此表成为一个只从基表中获取数据的视图。 实现INSERT / UPDATE / DELETE的INSTEAD OF触发器,将所有操作重定向到基表。 然后,您可以更新基表中的排序顺序,而不会触发任何触发器。

使用程序中的代码更新排序顺序可能更容易。

答案 1 :(得分:0)

好吧,我找到了办法。有些人不喜欢它,我确定,但它做了同样的事情,必须在代码中完成。有人可能想设置一个布尔变量来表示我们正在填充一个框,以便事件OnChange可以检查它而不做任何事情。

所以,因为这只是一个测试,所以这个表叫做testTbl,而且id行有一个名为sortOrder的整数行。这是调用AFTER INSERT的触发器。它允许插入sortOrder,并确保它出现在适当的位置。

DROP TRIGGER "main"."trig_testTbl";

CREATE TRIGGER "main"."trig_testTbl" AFTER INSERT ON "testTbl" FOR EACH ROW
BEGIN
    /* tell the trigUpdate table that we're updating*/
     UPDATE trigUpdate SET doNotUpdate = 1 WHERE tblName = 'testTbl';
    /* do what we need to do */
     UPDATE testTbl SET sortOrder = sortOrder + 1
     WHERE sortOrder >= New.sortOrder
     AND rowid <> New.rowid;
    /* Tell it we're done*/
     UPDATE trigUpdate SET doNotUpdate = 0 WHERE tblName = 'testTbl';
END;

在BEGIN在名为trigUpdate的表中将字段设置为1(True)之后,您将注意到第一行。

这是sortOrder的AFTER UPDATE的WHEN子句。有两个触发器在sortOrder上都被称为AFTER UPDATE。一种是当新的sortOrder小于旧的sortOrder时,另一种是反之亦然。

New.SortOrder&gt; Old.SortOrder And(SELECT doNotUpdate FROM trigUpdate WHERE tblName =&#39; testTbl&#39;)&lt;&gt; 1