1

我正在用這個拉我的頭髮。讓我們假設以下對象爲表中的SQL:級聯刪除鏈接表將兩個表中的每個表都級聯刪除到另一個表。怎麼樣?

  • 公司
  • 員工(指公司)
  • 會議(也指公司)

和員工可以在會議,所以我們有一個鏈接表:

  • EmployeeMeetings(即FK給員工和會議)

此外,我不能觸摸公司表(例如沒有觸發器)。我想有是:

  1. 所有僱員因公司被刪除
  2. 所有會議,如果一家公司被刪除
  3. 所有EmployeeMeeting記錄被刪除如果任何員工或移除被刪除會議被刪除

不幸的是我被卡住了,因爲這引發了可怕的「可能導致週期或多個級聯路徑」。考慮到約束條件,如何解決這個問題?我想我甚至不能將兩個FK都納入,否則存在這樣的風險,即刪除公司後,員工或會議無法刪除,因爲EmployeeMeetings中的FK會阻止此操作。對?

彼得

+0

是觸發完全禁止還是允許觸發`員工`和`會議`? – 2011-02-14 21:39:28

回答

1

如果我是你,我會避免觸發器和級聯刪除完全。他們總是以意想不到的方式工作。

與觸發器和級聯刪除相比,存儲過程很容易理解。所以,我想創建一個存儲過程,該公司之前將會議和員工:

create procedure dbo.RemoveCompany(@companyId int) 
as 
delete * from employees where CompanyId = @companyId 
delete * from meetings where CompanyId = @companyId 
delete * from companies where Id = @companyId 

作爲額外的獎勵,存儲過程創建數據庫和應用程序之間的明確合同。

+1

我討厭級聯刪除,因爲如果由於性能原因從父表副1中刪除一百萬條記錄,我會不同地編寫代碼。或者至少,我可能在非高峯時段運行它。我不希望有人在上午10點刪除一些記錄,這會導致數據庫在未來四個小時內被鎖定在一個事務中,因爲它會從數百個表中刪除數百萬個子記錄。級聯刪除是邪惡的,在我看來不應該被允許。 – HLGEM 2011-02-14 21:56:14

0

從公司到員工,從公司到會議,從員工到EmployeeMeetings級聯刪除。 刪除EmployeeMeetings中刪除的會議後添加觸發器。

create trigger Meetings_Delete on Meetings after delete 
as 
begin 
    set nocount on; 
    delete EmployeeMeetings 
    from deleted 
    where deleted.MeetingsID = EmployeeMeetings.MeetingsID 
end