这是表的结构:Id Name ParentId
ParentId
是主列 Id
的外键。现在假设我有几行,例如:(仅显示行中的 ParentId
)
01
/ \
5 2
/ \
3 4
我设置了 InsteadOfDelete
触发器,如下所示:
CREATE TRIGGER [dbo].[tr_tb] ON [dbo].[Some_tb]
INSTEAD OF DELETE
AS
/*Delete from another table*/
DELETE FROM SomeOther_tb WHERE OtherId IN(SELECT Id FROM deleted);
/*Delete childs from this table*/
DELETE FROM Some_tb WHERE ParentId IN(SELECT Id FROM deleted);
/*Delete from this table*/
DELETE FROM Some_tb WHERE Id IN(SELECT Id FROM deleted);
当删除 Id = 01
的记录时(检查上面子项的表示)。仅删除直接子项 (Id=5,2
),留下子子项记录 (Id = 3,4
)。
我假设 InsteadOfTrigger
函数不会为子项触发 (Id=5,2
)。
如何解决此问题,以便删除所有嵌套的子级?
最佳答案
CREATE TRIGGER [dbo].[tr_tb] ON [dbo].[Some_tb]
INSTEAD OF DELETE
AS
DECLARE @DELETED TABLE(
ID BIGINT
)
INSERT INTO @DELETED
SELECT Id FROM deleted
--could use a CTE here as well for better performance
WHILE @@ROWCOUNT>0
BEGIN
INSERT INTO @DELETED
SELECT Id
FROM Some_tb t
inner join @DELETED d on d.parentid=t.id
END
/*Delete from another table*/
DELETE FROM SomeOther_tb WHERE OtherId IN(SELECT Id FROM @DELETED);
/*Delete childs from this table*/
DELETE FROM Some_tb WHERE ParentId IN(
SELECT Id FROM @DELETED WHERE ID NOT IN (SELECT ID FROM DELETED)
);
/*Delete from this table*/
DELETE FROM Some_tb WHERE Id IN(SELECT Id FROM DELETED);
关于SQL:删除所有嵌套的自引用记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38400660/