Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite 是否有方法防止在删除和/或插入触发器内触发更新触发器?_Sqlite_Triggers - Fatal编程技术网

Sqlite 是否有方法防止在删除和/或插入触发器内触发更新触发器?

Sqlite 是否有方法防止在删除和/或插入触发器内触发更新触发器?,sqlite,triggers,Sqlite,Triggers,长话短说,在SQLite中,我有一个sortOrder字段,用于处理表中项目的可变排序顺序。我认为: Inesrt之后:如果所有sortOrder字段大于插入的字段,则触发器将其更新+1 删除后:如果所有sortOrder字段大于已删除字段的值,则触发器将其更新为-1 在更新排序器时。这将根据数字是移到高于还是低于其上一个点的位置,从排序器字段中进行加减 现在问题来了。所有更新表集合sortOrder=在更新时触发的内容 那么,有没有办法在其他触发函数期间关闭更新功能?将此表设置为仅从基表获取数

长话短说,在SQLite中,我有一个sortOrder字段,用于处理表中项目的可变排序顺序。我认为:

Inesrt之后:如果所有sortOrder字段大于插入的字段,则触发器将其更新+1

删除后:如果所有sortOrder字段大于已删除字段的值,则触发器将其更新为-1

在更新排序器时。这将根据数字是移到高于还是低于其上一个点的位置,从排序器字段中进行加减

现在问题来了。所有更新表集合sortOrder=在更新时触发的内容


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

将此表设置为仅从基表获取数据的视图。 实现INSERT/UPDATE/DELETE的INSERT OF触发器,将所有操作重定向到基表。 然后,您可以在不触发任何触发器的情况下更新基表中的排序顺序


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

我找到了一种方法。我敢肯定,有些人会不喜欢它,但它做的事情和当时必须在代码中完成的事情是一样的。有人可能想设置一个布尔变量,表示我们正在填充一个框,以便事件OnChange可以检查它,而不做任何事情

因此,由于这都是一个测试,所以该表被称为testTbl,它和一个id行都有一个整数行,名为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更新后的WHEN子句。有两个触发器都是在sortOrder上更新后调用的。一个是当新的排序器小于旧的排序器时,另一个是vica versa


New.SortOrder>Old.SortOrder并从trigUpdate中选择doNotUpdate,其中tblName='testTbl'1

如何通过指定WHEN语句和/或在更新时使用而不是在更新时使用simple来修改更新时触发器?我不确定您的解决方案看起来有多完整,但这可能会有所帮助?我正在使用的更新,但这是其他触发器中正在更新的字段。我很想去哪里,但是在哪里呢?触发时有触发器吗?你说得对。从代码中执行可能更容易。问题是,我希望INSERT或DELETE触发器触发,而不会导致在其他两个触发器中更改的每个排序器触发UPDATE触发器。ie:INSERT:updatetesttbl SET sortOrder=sortOrder+1,其中sortOrder>=New.sortOrder和rowid New.rowid;运行此操作时,它会调用每个记录的更新。