0

我正在尝试为我的 sql server 数据库创建已删除的触发器。删除记录后,触发器执行并更新树中其他节点的左、右、...。有关嵌套集模型的详细信息。这是我删除触发器的sql代码:

        ALTER TRIGGER [dbo].[delete-test-nested]
             ON [dbo].[Test]
             AFTER DELETE
             AS
        BEGIN    
         DECLARE @start int = 0, @end int
         SELECT @end = count(*) from deleted
         WHILE(@start < @end)
           BEGIN
               DECLARE @left int, @right int, @level int, @root int, @parentId int

               SELECT @id = t.Id, @lft = t.Lft, @rgt = t.Rgt, @lvl = t.Lvl, @root = t.Root
               FROM deleted t
               ORDER BY t.Id OFFSET @offset_record ROWS FETCH NEXT 1 ROWS ONLY;

               DELETE FROM Test WHERE Left > @Left AND Right < @Right AND Root = @Root

               UPDATE Test SET Left = Left - (@Right - @Left + 1) WHERE Left > @Left AND Root = @Root
               UPDATE Test SET Left = Left - (@Right - @Left + 1) WHERE Right > @Right AND Root = @Root
               SET @start = @start+ 1; 
            END
        END

初始状态:

+----+----------+------+-------+-------+------+------+--+
| Id | ParentId | Left | Right | Level | Text | Root |  |
+----+----------+------+-------+-------+------+------+--+
|  1 | null     |    1 |    18 |     1 | Test |    1 |  |
|  2 | 1        |    2 |     3 |     2 | Test |    1 |  |
|  3 | 1        |    4 |    11 |     2 | Test |    1 |  |
|  4 | 3        |    5 |     6 |     3 | Test |    1 |  |
|  5 | 3        |    7 |    10 |     3 | Test |    1 |  |
|  6 | 5        |    8 |     9 |     4 | Test |    1 |  |
|  7 | 1        |   12 |    17 |     2 | Test |    1 |  |
|  8 | 7        |   13 |    14 |     3 | Test |    1 |  |
|  9 | 7        |   15 |    16 |     3 | Test |    1 |  |
+----+----------+------+-------+-------+------+------+--+

该代码适用于删除单个记录,例如:

        DELETE FROM Test
        WHERE Id IN (2)
        DELETE FROM Test
        WHERE Id IN (3)

正确的:

+----+----------+------+-------+-------+------+------+--+
| Id | ParentId | Left | Right | Level | Text | Root |  |
+----+----------+------+-------+-------+------+------+--+
|  1 |          |    1 |     8 |     1 | Test |    1 |  |
|  7 |        1 |    2 |     7 |     2 | Test |    1 |  |
|  8 |        7 |    3 |     4 |     3 | Test |    1 |  |
|  9 |        7 |    5 |     6 |     3 | Test |    1 |  |
+----+----------+------+-------+-------+------+------+--+

但是当我试图同时删除多条记录时,问题发生了:

        DELETE FROM Test
        WHERE Id IN (2,3)

错误的:

+----+----------+------+-------+-------+------+------+--+
| Id | ParentId | Left | Right | Level | Text | Root |  |
+----+----------+------+-------+-------+------+------+--+
|  1 | null     |    1 |     8 |     1 | Test |    1 |  |
|  4 | 3        |    3 |     4 |     3 | Test |    1 |  |
|  7 | 1        |   10 |     7 |     2 | Test |    1 |  |
|  8 | 7        |   11 |     4 |     3 | Test |    1 |  |
|  9 | 7        |    5 |     6 |     3 | Test |    1 |  |
+----+----------+------+-------+-------+------+------+--+
4

0 回答 0