on update cascade
トリガーを使用して実装することは可能ですか? 次のサンプル コードを書きました (これもhttp://sqlfiddle.com/#!6/d7298/1にあります)。
create table Parent
(
Id int not null,
IsDeleted bit not null,
)
alter table Parent add constraint PPK primary key (Id, IsDeleted)
create table Child
(
Id int not null,
IsDeleted bit not null,
ParentId int not null,
ParentIsDeleted bit not null,
)
alter table Child add constraint CPK primary key (Id, IsDeleted)
alter table Child add constraint CFK foreign key (ParentId, ParentIsDeleted) references Parent(Id, IsDeleted)
go
create trigger ParentAfterUpdate on Parent
after update
as
begin
if update(IsDeleted)
update c set c.ParentIsDeleted = i.IsDeleted from Child c inner join Inserted i on c.ParentId = i.Id
end
go
insert into Parent values(100,0)
insert into Child values(1000,0,100,0)
update Parent set IsDeleted = 1
CFK
制約がエラーをスローするため、これは機能しません。親レコードが論理的に削除されるたびに子レコードが論理的に削除されるように、論理的な削除をカスケードすることを望んでいました。
をIsDeleted
取り出すとCFK
、更新を にカスケードできますChild
が、高度な同時実行環境では、データベースが破損した状態になる可能性があると思います。
T0 で: Entity Framework が親をメモリに読み込みます。親は削除されません。
T1 で: 親は別の独立したクエリによって論理的に削除されます
T2 で: EF は子レコードを挿入しIsDeleted
ますが、外部キーの一部ではないため、削除された親を指すアクティブな子があります。