2012-10-31 4 views
1

두 개의 테이블이 있다고 가정 해보십시오. ErrorsErrorsDetails. 그래서 많은 ErrorDetails 레코드를 포함 할 수있는 하나의 Errors 레코드가 있습니다.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