有人可以仔细检查我的精简示例吗?当Documents表更新时,我希望它更新Queue表上的EntryDate。但是,我不希望仅针对此过程触发“队列”表上的触发器。意思是,如果某个其他进程在运行该进程时更新了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