是否有可能在删除触发器中判断它是否是由级联删除FK引起的?



我有一个触发器在SQL Server 2008 R2中删除时触发。在这个触发器中,我希望能够区分用户查询中的手动删除(DELETE from…)和外键上ON DELETE CASCADE动作引起的删除。这可能吗?

我想解决的问题是,我想防止人们直接从表中删除,但我仍然希望级联删除外键工作

级联删除不检查权限。所以不要从表中授予用户delete的权限:

create table T1 (ID int not null primary key)
insert into T1(ID) values (1)
create table T2 (T1ID int not null references T1(ID) on delete cascade)
insert into T2(T1ID) values (1)
go
create user Barry without login
go
grant delete on T1 to Barry
go
deny delete on T2 to Barry
go
execute as user = 'Barry'
go
select USER_NAME()
go
delete from T1
go
revert
go
drop user Barry
go
select * from T2

您可以检查'parent'表中是否存在具有适当ID的行。如果删除是由级联引起的,则不再有"父"行。如果存在父行,则有人直接在'子'表中删除。

<<p> SQLFiddle演示/strong>

最新更新