启用和禁用触发器的替代选项



对于这个例子,启用和禁用触发器的替代方案是什么?这是我的触发器,我有一个场景,不应该允许它直接更新Table33中的Column33列(通过执行查询update Table33 SET Column33='123'(,但应该允许它从其他正在进行一些计算的触发器中更新该列。当我在其他触发器中禁用触发器Triger33,在触发器内部进行更新,然后再次启用此触发器时,它就会工作。这种解决方案不好。有没有一种方法可以让我对这个触发器设置某种条件,这样它就可以允许非直接的更新,这样我就可以避免在其他触发器中禁用和启用?

create trigger [dbo].[Trigger33]
on [dbo].[Table33]
AFTER UPDATE
as
if UPDATE(Column33)
begin
raiserror('It is not allowed to update Column33 in Table33', 16,1)
rollback
end

您可以使用嵌套触发器服务器配置选项或nested_triggers数据库配置选项(用于部分包含的数据库(允许触发器代码全局绕过其他触发器。

例如

EXEC sp_configure 'show advanced options', 1;  
GO  
RECONFIGURE ;  
GO  
EXEC sp_configure 'nested triggers', 0 ;  
GO  
RECONFIGURE;  
GO  
create table t(id int primary key)
create table t2(id int primary key)
go
create trigger te_nope on t2 after insert 
as
begin
throw 50001, 'nope', 1;
end
go
create trigger t_ins on t after insert
as
begin
insert into t2(id) select id from inserted 
end
go
insert into t2(id) values (1)  --fails
--Msg 50001, Level 16, State 1, Procedure te_nope, Line 4 [Batch Start Line 32]
--nope
insert into t(id) values (1) --suceeds
--(1 row affected)
--
--(1 row affected)

其他选项包括将机密推入内部触发器中检查的CONTEXT_INFO,或者执行模拟以修改嵌套触发器的行为。

最新更新