Можно ли реализовать 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
не является частью внешнего ключа, есть активный дочерний элемент, указывающий на удаленного родителя.