1

2つのテーブルがあるとします。 ErrorsおよびErrorsDetails。したがって、多くのErrorDetailsレコードを含む可能性のある1つのErrorsレコードがあります。

ユーザーは、使用するアプリケーションを介して詳細レコードを定期的に削除します。すべての詳細レコードがクリーンアップ(削除)されたら、マスターレコードも自動的に削除したいと思います。

すばらしいのは、マスターが所有する詳細がなくなった場合に詳細とマスターを削除する1つのSQL削除ステートメントです。しかし、それを行うクリーンなSQLステートメントを取得できないようです。削除するたびにマスターをポーリングして詳細を確認したくありません。

エラー

ID        Error
1         Import Error
2         Export Error

エラー詳細

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

提案をありがとう。

アップデート

トリガーを使用することが言及されています。私はそれについて考えましたが、それについては言及しませんでした。トリガーは確かに仕事をします。このシナリオのトリガーの長所/短所?

4

1 に答える 1

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
于 2012-10-31T12:45:10.040 に答える