2012-10-31 67 views
1

說我有兩張桌子。 ErrorsErrorsDetails。所以我有一個錯誤記錄可能包含許多ErrorDetails記錄。如何在SQL Server 2008中刪除所有詳細記錄時自動刪除主記錄?

用戶將通過他們使用的應用程序定期刪除詳細記錄。當清除所有詳細記錄(刪除)時,我想自動刪除主記錄。

什麼是酷將是一個SQL刪除語句,將刪除細節和主人,如果主人沒有更多的細節。但我似乎無法得到一個乾淨的SQL語句。每次刪除後,我寧願不詳細詢問主人的細節。

錯誤

ID  Error 
1   Import Error 
2   Export Error 

ErrorsDetails

ID  ErrorsID  DetailedInfo 
1   1    Couldn't import file because of FTP error 
2   1    Couldn't import file because of permission error 
3   2    Couldn't export file because of directory doesn't exist 

我試着加入cascade刪除約束,像這樣,但它似乎沒有工作。

alter table dbo.ErrorsDetails 
    add constraint FK_Delete_Master 
     foreign key (ErrorsID) references dbo.Errors(ErrorsID) on delete cascade 

感謝您的任何建議。

UPDATE

它已經提到使用觸發器。我想過但沒有提及它。觸發器肯定會完成這項工作。這種情況下觸發器的優點/缺點?

回答

2

可以使用觸發器 或

declare @ErrorsId int 
select @ErrorsId = ErrorsId from ErrorsDetails where ID = @id 
delete from ErrorsDetails where ID = @id 

declare @errorDetailCount int 
select @errorDetailCount = count(*) from ErrorsDetails where ErrorsId = @ErrorsId 

if (@errorDetailCount = 0) 
begin 
delete from Errors where ID = @ErrorsId 
end 

更新: 觸發:

create trigger [dbo].[ErrorsDetails_Delete_Trigger] on [dbo].[ErrorsDetails] 
instead of delete 
as 
begin   
    declare @ErrorsId int 
    select @ErrorsId = ErrorsId from deleted 
    delete from ErrorsDetails where ID = deleted.ID 

    declare @errorDetailCount int 
    select @errorDetailCount = count(*) from ErrorsDetails where ErrorsId = @ErrorsId 

    if (@errorDetailCount = 0) 
    begin 
    delete from Errors where ID = @ErrorsId 
    end  
end 
+0

我想過觸發器。我應該在我原來的問題中提到這一點。優點/缺點觸發器? – cbmeeks