gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:40:29 26 4
gpt4 key购买 nike

有人可以仔细检查我的精简示例吗?当 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com