是否可以使用触发器实现on update cascade
?我写了下面的示例代码(也http://sqlfiddle.com/#!6/d7298/1):通过SQL Server中的更新触发器级联外键软删除标志
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: 实体框架将父项加载到内存中。父不会被删除。
在T1: 父是软的另一个独立的查询
在T2删除: EF插入一个子记录,但由于IsDeleted
不是外键的部分,有指向一个活跃的孩子删除的父母。
谢谢。我将采取独特的索引方法。你能评论多少存储空间分配给uq?它是每行4 + 1 = 5个字节吗?我相信在非聚集索引中,索引键的大小与聚集索引的大小相结合。只是想知道需要多少额外空间来维护上述数据结构。 – Mark13426
如果表被聚集在'Id'上,开销很小。 NCI将包含来自CI的列,但不是两次,这是正确的。 – dean