我正在尝试为我的 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 | |
+----+----------+------+-------+-------+------+------+--+