如何仅为当前进程禁用SQL Server触发器?

Cur*_*tis 2 sql sql-server transactions

有人可以仔细检查我修剪过的例子吗?更新Documents表时,我希望它更新Queue表上的EntryDate.但是,我不希望队列表上的触发器仅针对此进程触发.这意味着,如果某个其他进程在此进程运行时更新Queue表上的EntryDate,我将希望队列表上的触发器为该特定事务触发.我不确定是否需要为下面的代码执行任何类型的锁定,以确保没有其他进程踩到它的脚趾.谢谢!

create trigger [dbo].[Documents_trigUpdate] on [dbo].[Documents]
for update
as

begin transaction

alter table [Queue] disable trigger Queue_trigUpdate
update  [Queue] set EntryDate = getdate()
alter table [Queue] enable trigger Queue_trigUpdate

commit transaction

go
Run Code Online (Sandbox Code Playgroud)

Mic*_*son 9

您将希望避免禁用然后重新启用触发器,因为这将影响所有进程而不仅仅是当前进程.如果您放置某种类型的锁,您将序列化您的代码,这可能成为您系统中的瓶颈.

另一种方法是使用Context_info当前连接,Queue如果已设置特定上下文,则将触发器更改为不执行.

本文介绍了此技术,下面提供了一个示例:

-- Creating the queue trigger
create trigger [dbo].[Queue_trigUpdate] on [dbo].[Queue]
for update
as   

declare @Cinfo varbinary(128)  
select @Cinfo = Context_Info()  
if @Cinfo = 0x55555  
    return  

print 'Trigger Executed'  
-- Actual code goes here  
go
Run Code Online (Sandbox Code Playgroud)

要防止执行触发器,您可以执行以下操作:

create trigger [dbo].[Documents_trigUpdate] on [dbo].[Documents]
for update
as

-- Save the original context info    
declare @originalContextInfo VARBINARY(128)
set @originalContextInfo = Context_Info()

set Context_Info 0x55555 
update  [Queue] set EntryDate = getdate()

-- Reset the context info
set Context_Info @originalContextInfo 
go
Run Code Online (Sandbox Code Playgroud)