1

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

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

4

2 回答 2

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
于 2013-06-14T07:30:08.430 回答
2

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

SQLFiddle 演示

于 2013-06-14T07:44:03.070 回答