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

时间:2013-06-14 07:15:45

标签: sql sql-server tsql triggers foreign-keys

我有一个触发器在SQL Server 2008 R2中的删除时触发。在此触发器中,我希望能够区分用户查询的手动删除(DELETE FROM ...)与外键上的ON DELETE CASCADE操作导致的删除之间的区别。这可能吗?

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

2 个答案:

答案 0 :(得分:2)

级联删除不会检查权限。因此,不要授权用户从表中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

答案 1 :(得分:2)

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

<强> SQLFiddle Demo