【问题标题】:Is it possible to tell in a delete trigger whether it was caused by a cascade delete FK?是否可以在删除触发器中判断它是否是由级联删除 FK 引起的?
【发布时间】:2013-06-14 07:15:44
【问题描述】:

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

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

【问题讨论】:

  • “级联删除外键”——我总是把它关掉。

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


【解决方案1】:

级联删除不检查权限。所以只是不要授予用户从表中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

【讨论】:

  • 好主意,虽然它在我的情况下不太有效,因为另一个触发器需要能够从表中删除。
  • @Paul - 该触发器可能有一个EXECUTE AS 子句。重点仍然存在 - 不要授予用户执行您不希望他们能够执行的操作的权限。
【解决方案2】:

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

SQLFiddle Demo

【讨论】:

    猜你喜欢
    • 2021-05-29
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多