5

我有用戶郵政之間的1 .. *關係。 (一個用戶有很多文章)SQL Server 2008 - 多級聯FK - 我需要一個觸發器嗎?

郵政有一個FK稱爲「用戶ID」,其映射到「用戶ID」字段上用戶表。

我試圖設置此FK作爲級聯更新/刪除,但我得到這個錯誤:

'Users' table saved successfully 'Posts' table - Unable to create relationship 'FK_Posts_Users'.
Introducing FOREIGN KEY constraint 'FK_Posts_Users' on table 'Posts' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint. See previous errors.

我有一個表叫PostHelpful。一篇文章有​​很多有用的。

有幫助有一個級聯FK用戶(所以當一個用戶被刪除,他們的幫助也被刪除)。

但我認爲這是「多重級聯路徑」的投訴原因。

因爲如果我刪除了一個用戶(當前),它會刪除他們的幫助。但即時通訊試圖添加一個cacade郵政也,它會刪除郵政,然後嘗試刪除有用的郵件(作爲有幫助也有級聯FK郵政)。在這種情況下,SQL選擇哪個級聯FK?

這裏是有問題的三個表的數據庫圖表:

enter image description here

正如你所看到的,「PostHelpful」是孩子既有「郵報」和「用戶」(具有FK的既)。

所以我不能讓兩個鍵級聯?我是否需要「用戶」(AFTER DELETE)上的觸發器來手動刪除幫助文件(和其他引用用戶的表)。

+0

您已經發現問題以及如何解決問題。刪除User和PostHelpful之間的級聯刪除,在PostHelpful中添加一個觸發器給用戶'on delete'刪除。那麼你應該可以在User和Post之間添加級聯刪除。 – 2011-02-24 09:48:15

+0

@Mikael Eriksson - 真的嗎?我的意思是它會工作,但我希望這是做錯事情的錯誤方式。觸發器不應該強制引用完整性。 – RPM1984 2011-02-24 11:05:47

+0

嗯。從未將級聯刪除視爲參照完整性約束的一部分。更像是一種處理刪除的便捷方式。我可能不會使用觸發器或級聯刪除。我會編寫一個按正確順序刪除的存儲過程。 – 2011-02-24 11:12:32

回答

3

這不是SQL Server選擇哪條路徑的問題,它不允許它使它不會處於妥協位置。當我們遇到這種情況時,我們不得不求助於觸發器。

1)作爲錯誤消息指出,改變Users_PostHelpfuls FK到ON DELETE NO ACTION

2)添加INSTEAD OF DELETE觸發到用戶:

CREATE TRIGGER dbo.Users_IO_Delete 
ON dbo.Users 
INSTEAD OF DELETE 
AS 
BEGIN; 
    DELETE FROM dbo.PostHelpfuls WHERE UserId IN (SELECT UserId FROM deleted); 

    DELETE FROM dbo.Users WHERE UserId IN (SELECT UserId FROM deleted); 
END; 

現在,FK仍將執行DRI,但觸發器級聯刪除,而不是FK約束。

您可以將後幫助職位在上述步驟。但是,當這樣做時,最好使用觸發器來刪除不那麼獨立的實體記錄。換句話說,它更可能是帖子都涉及到表用戶PostHelpfulsPostHelpfuls有關表格用戶帖子旁邊的旁邊。

+0

好吧,這就是我的想法。所以我現在有三個人說同樣的事情。該死的,好的 - 歡呼聲。 – RPM1984 2011-03-03 22:32:03