在SQL Server 2008中删除所有详细记录后,如何自动删除主记录?

时间:2012-10-31 12:35:58

标签: sql-server-2008 master-detail cascading-deletes

说我有两张桌子。 ErrorsErrorsDetails。所以我有一个可能包含许多ErrorDetails记录的错误记录。

用户将通过他们使用的应用程序定期删除详细记录。清理(​​删除)所有详细记录后,我也想自动删除主记录。

如果主服务器不拥有更多详细信息,那么删除详细信息和主服务器的一个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

感谢您的任何建议。

更新

有人提到使用触发器。我想到了,但没有提到它。触发器肯定会起作用。这种情况的触发器的优缺点是什么?

1 个答案:

答案 0 :(得分: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