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