2017-01-15 25 views
1

我想在SQL Server 2016中使用時態表。當前時態表不允許使用ON DELETE CASCADE。我怎樣才能實現觸發器來模仿行爲?我想保留外鍵,因爲我在我的應用程序中使用了實體框架的導航屬性。如何實現SQL Server觸發器作爲ON DELETE CASCADE的替代方法?

我認爲後觸發不起作用,因爲刪除語句不適用於外鍵條件。

假設我們有以下簡單的情況:

enter image description here

  1. UserRole.UserId:外鍵USER.ID
  2. UserRole.RoleId:外鍵Role.Id

如果我刪除Id == 2的角色比我想要刪除UserRole中的第二和第四行。如何在時態表中沒有ON DELETE CASCADE的情況下執行此操作?

+0

你有沒有聽說過的'而是Triggers'的,google一下。 –

+0

是的,但INSTEAD OF觸發器不允許在當前表或歷史表上以避免使DML邏輯無效。 AFTER觸發器僅在當前表格上被允許。它們被阻止在歷史記錄表上以避免使DML邏輯無效。 – cSteusloff

+0

考慮一下 - 如果通過類似觸發器的方式實現'ON DELETE CASCADE'很微不足道,爲什麼微軟的開發者沒有使用這種機制實現'ON DELETE CASCADE',而不是將其列爲限制?您嘗試的任何解決方法可能會遇到類似的限制。 –

回答

1

就像我在評論部分中提到,您將需要一個Instead of Trigger,像這樣的東西......

CREATE TRIGGER tr_CascadeDelete_UserRole 
ON [Role] 
INSTEAD OF DELETE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    --** Delete Rows from [UserRole] table first 
    DELETE FROM [UserRole] 
    WHERE EXISTS (SELECT 1 
       FROM Deleted d 
       WHERE d.RoleID = [UserRole].RoleID) 

    --** Delete Rows from [Role] table first 
    DELETE FROM [Role] 
    WHERE EXISTS (SELECT 1 
       FROM Deleted d 
       WHERE d.RoleID = [Role].RoleID) 

END 
+0

它們[暫不允許](https://msdn.microsoft.com/en-gb/library/mt604468.aspx)在時態表上 –