2012-01-27 48 views
4

我有一個與父表(TableA)有外鍵關係的表(TableB)。SQL Server - 保持不帶CASCADE和INSTEAD OF觸發器的引用完整性

當我刪除表A中的記錄時,我想通過刪除表B中引用TableA中的刪除記錄的所有記錄來保持參照完整性。

通常我會刪除級聯。但是由於SQL Server中的表結構和針對多個級聯路徑的過度保護措施,對於此特定關係而言,這是不可能的。

我也不能使用INSTEAD OF觸發器,因爲TableA本身具有CASCADE外鍵關係。

我在做的是將TableA和TableB之間的關係改爲ON DELETE SET NULL,然後創建一個AFTER觸發器來清理TableB中的NULL記錄。

有沒有更好的方法來處理這種情況?

+0

你能解釋一下你的意思嗎?「由於表結構和針對多個層疊路徑的過度保護防護措施」,並且可能包括您的表定義? – JohnFx 2012-01-27 17:22:55

+0

我明白,人們的直接想法是看設計,但我認爲這不是特別不合理,在任何情況下,重組都不是一種選擇。所以我只是在尋找如何解決這個問題而不需要重新設計的建議。我認爲這個答案總結了我對SQL Server安全保護[級聯刪除導致多個級聯路徑]的情況和想法(http://stackoverflow.com/a/5407007/295813) – 2012-01-27 17:29:50

+1

只是好奇,什麼現實世界的限制阻止你發佈在子表上刪除,然後在父項上刪除,兩者都可能包含在事務中? – 2012-01-27 17:34:00

回答

0

你能否改變另一個限制阻止你添加這個作爲ON DELETE CASCADE

您可以添加一個DeleteMe列,然後發出UPDATE A SET DeleteMe = 1,然後使用after觸發器先刪除表B行,然後是請求的表A行?

你可以拆分或合併表(垂直,即)以某種方式分離它們的互斥依賴嗎?

+0

1.我可以打破瀑布別處的路徑。然而,這種關係將是我理想的地方,因爲它是最不重要的。 2.這會工作,但我認爲我更喜歡我的類似SET NULL解決方案。 3。我不認爲這會消除多個級聯路徑。 – 2012-02-06 09:32:07

+0

3.項目取決於您如何將表格和多個約束的確切性質分割到同一列。所以,根據你所說的,聽起來你的想法是更新爲NULL。 +1是一個很好的問題。 – ErikE 2012-02-06 17:21:20

相關問題