2010-11-19 119 views
5

有一個名爲person的表。 其中有personid和contactid。DELETE SQL的設計決策

如果一個人被刪除,那麼我希望將該人從db以及該人的相關聯繫人中刪除。

是在一個存儲過程中執行DELETES更好的做法,或者如果我的業務層首先調用pContactDelete然後調用pPersonDelete ???????

感謝 尼爾

+0

只是一個建議,但這是某種可能需要「UNDO」的事情(即將一個人恢復到您的系統)。你是否考慮過對自己的人有一個「積極」的標誌,並且做一個邏輯的而不是物理的刪除? – Paddy 2010-11-19 11:00:49

回答

12

假設你正在使用的MS SQL Server:

你或許應該在你的外鍵使用ON DELETE CASCADE

ALTER TABLE Contact 
ADD CONSTRAINT FK_PersonContact FOREIGN KEY (PersonId) 
REFERENCES Person(PersonId) ON DELETE CASCADE 

這將確保刪除聯繫人行時刪除人員行。這是一個始終由數據庫執行的約束。

您還可以在SQL Management Studio的「外鍵關係」對話框的「插入和更新規範」部分的「刪除規則 - >設置爲級聯」中進行設置。

只要確保在某個地方緩存了業務層中的Contact對象,就可以刷新緩存。

1

你採取任何方式級聯效應,數據應該是一致的狀態。如果您在同一存儲過程的兩個表上執行操作,則會更簡單。如果你把它放在你的業務中,我認爲你應該使用交易,這樣如果你的聯繫人沒有被刪除,你可以回滾刪除人。

1

如果你使用Oracle,你有幾個選項。

  1. 設置PERSON和CONTACT表之間的外鍵級聯刪除。

  2. 創建ON D​​ELETE觸發器並在那裏執行刪除操作。這個選項也使您有機會創建任何必要的審計跟蹤條目或寫入任何日誌文件等,當刪除某些內容時這可能是必需的。

分享和享受。

+0

+1不限於Oracle,因爲各種RDBMS支持ON DELETE CASCADE用於外鍵和ON DELETE觸發器 – fredt 2010-11-19 11:32:29

0

我對這個問題的方法是不使用級聯刪除約束作爲一般原則。 當存在循環引用時,級聯刪除可能會產生奇怪的影響。 在生產環境中,建議通過一個存儲過程來刪除子引用。 只要您在刪除聯繫人之前沒有執行任何重要驗證,就無需在業務層進行此調用

+0

我有這樣糟糕的想象力,我無法看到可能存在循環引用帶級聯刪除的外鍵的情況。我認爲刪除<->設置空(或設置默認)是比較常見的。 – 2010-11-19 12:43:59

+0

嗨Arto,幫助你的想象力假設主表「SalesMan」和子表作爲「訂單」。訂單表包含「PrimarySalesManId」和「SecondarySalesManId」。現在,如果您想從主表中刪除記錄,並且級聯刪除處於打開狀態,您希望刪除如何工作?它有幫助嗎? – Hunter 2010-11-22 12:10:55