作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有人可以仔细检查我的精简示例吗?当 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/
我是一名优秀的程序员,十分优秀!