2017-08-26 99 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