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

标签 sql sql-server transactions

有人可以仔细检查我的精简示例吗?当 Documents 表更新时,我希望它更新 Queue 表上的 EntryDate。但是,我不希望 Queue 表上的触发器仅针对此过程触发。意思是,如果其他进程在该进程运行时更新 Queue 表上的 EntryDate,我希望 Queue 表上的触发器为该特定事务触发。我不确定是否需要对以下代码进行任何类型的锁定,以确保没有其他进程被踩到。谢谢!

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

最佳答案

您需要避免禁用然后重新启用触发器,因为这将影响所有进程,而不仅仅是当前进程。如果你加了某种类型的锁,你会序列化你的代码,这可能会成为你系统的瓶颈。

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

This technique is covered in this article ,下面给出一个例子:

-- 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

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

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

关于sql - 如何仅为当前进程禁用 SQL Server 触发器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11766322/

相关文章:

sql-server - Microsoft SQL Server 2005 控制台写入行

hadoop - hive 问题与更新

java - @Transactional 不适用于方法级别

android - MYSQL查询,合并不相关表的记录以进行自动完成

javascript - 如何在单击/提交提交按钮时先执行 php 函数然后执行 javascript 函数

sql - 从 SQL Server 中的日期检索年份和周数

java - Java Connection.close 是否回滚?

php - LEFT JOIN 只返回右表中的一行

SQL Server : What's the limit on number of UNIONs?

sql - 数据库设计 : should nested objects have their own table?