2017-08-26 105 views
0

我有表名称调用的小部件,并有删除触发器。当我删除一个特定的行我还想删除其他行实现的具有RelotionshipMS SQL触发器 - 可以删除触发器也影响删除行触发器

触发条件

ALTER TRIGGER [dbo].[Trigger_sys_widgets_Delete] 
    ON [dbo].[sys_widgets] 
    AFTER DELETE 
AS 
BEGIN 
    Delete From sys_Widgets Where parent in (Select id From deleted); 
END 

但是这不会删除其他行只是第一行删除!

我可以安排Depete循环,直到一无所有这触发作品相对童车

也尽量级联删除像

Alter Table sys_widgets Add Constraint FK_sys_widgets foreign Key (parent) References sys_widgets(id) On Delete Cascade; 

这是可以做到的,对于相同的表

+0

您可以使用[级联删除](https://stackoverflow.com/questions/6260688/how-do-i-use-cascade-delete-with-sql-server) – Khalil

+0

但有办法做到对于同一表类似 变更表sys_widgets添加约束FK_sys_widgets外键(父)引用sys_widgets(id)On Delete Cascade; – Proje

+0

关于删除级联的自引用表[链接](https://stackoverflow.com/questions/42228082/on-delete-cascade-for-self-referencing-table) – Khalil

回答

0

你可以使用递归CTE通过一次触发运行来删除所有的孩子。

ALTER TRIGGER [dbo].[Trigger_sys_widgets_Delete] 
    ON [dbo].[sys_widgets] 
    AFTER DELETE 
AS 
BEGIN 
    WITH ForDelete AS 
    (
     SELECT widgets.id 
     FROM [dbo].[sys_widgets] AS widgets 
     INNER JOIN deleted ON widgets.parent = deleted.id 
     UNION ALL 
     SELECT widgets.id 
     FROM [dbo].[sys_widgets] AS widgets 
     INNER JOIN ForDelete ON widgets.parent = ForDelete.id 
    ) 
    DELETE FROM [dbo].[sys_widgets] 
    WHERE id in (SELECT id FROM ForDelete); 
END