2010-06-05 107 views
1

我正在使用SQL Server 2005,我必須將關係放入一個表中。我不得不關閉「強制外鍵約束」,因爲我有2個關係進入同一個表。SQL Server 2005,強制實施外鍵約束和級聯刪除

但是我想把層疊刪除。

我想如果我對這兩種關係進行級聯刪除,並且如果我說從這些表中刪除了一些東西,它會級聯並刪除到另一個表中。

但是,它似乎並沒有這樣工作,我想知道是否因爲我有foriegn關鍵約束關閉?

如果是這種情況,我該如何解決這個問題?

+4

我傾向於不使用級聯刪除。這太危險了。相反,我更喜歡應用程序明確執行這些級聯刪除操作。 – 2010-06-05 01:21:16

+0

@Mitch小麥,問題在於偶爾事情是在應用程序之外完成的。另外,對於像輔助表這樣的事情來說,這很有道理。 – 2010-06-05 01:23:53

+0

@nathan gonzalez我們通常不允許刪除操作(僅僅是不激活行),當我們需要級聯行爲時,它由存儲過程或表/視圖上的觸發器處理。我強烈建議不允許大多數登錄都直接訪問表,尤其是刪除 - 這會在指定的數據庫控制範圍之外停止操作。 – 2010-06-05 02:42:48

回答

2

你必須有一個fk約束來強制級聯刪除。 sql server如何知道要刪除的內容?

2

我不清楚爲什麼你需要首先禁用外鍵約束。你可以有許多關係到同一個表,所有這些都強制執行參照完整性。但是,如果與同一子表中的同一父表有兩個關係,則只能在其中的一個上啓用級聯更新或級聯刪除。

TBH,我不能想到一種情況,我想要一個關係,但不希望它強制執行。您應該始終修復數據並強制執行關係,以免數據損壞。

這實際上是通過存儲過程漏斗數據訪問有所幫助的情況。如果您強制人們只通過存儲過程刪除,則可以在過程中強制執行級聯刪除,而無需在DRI中強制執行。

2

SQL服務器將不允許多個級聯路徑。爲了解決這個問題,將'FOR DELETE'觸發器添加到每個附加路徑。

ALTER TRIGGER [dbo].[trgMyTriggerName] ON [dbo].[tblMyTable] FOR DELETE AS 
SET NOCOUNT ON 
DELETE FROM tblMySubTable 
WHERE MySubTable_Parent_ID IN (SELECT MyTable_ID FROM deleted) 

您仍然需要添加外鍵,只需設置「強制執行外鍵約束」爲否,使您的刪除規則和更新規則不採取任何行動。這使您可以使用外鍵的所有優點(智能感知,實體框架等)。