运行后取消主触发器(更新后)触发器类型
Posted
技术标签:
【中文标题】运行后取消主触发器(更新后)触发器类型【英文标题】:Cancel main trigger after running (after update) trigger type 【发布时间】:2019-09-10 17:58:35 【问题描述】:我创建了一个触发器,它是“类型后更新”,这个更新命令(在它内部)可以再次调用主触发器。如果在调用更新触发器之后不会再次调用主触发器,如何告诉 SQL Server。
【问题讨论】:
请分享您的代码 如果我没看错,你为什么要在触发器内再次更新表?听起来您可能想使用和Instead of Trigger
。
我的表中有一个 dore_number 字段,我需要通过某些条件再次更新一个表,这与 dore_number 相关。所以主触发器获取先前数据的历史记录,第二个触发器根据条件执行操作跨度>
【参考方案1】:
-
使用
COLUMNS_UPDATED()
为了防止在从触发器内更新表时触发器无限期地重复,您可以使用COLUMNS_UPDATED()
测试哪些列已更新,然后在更新模式只能来自触发器内时返回。例如
ALTER trigger [dbo].[MyTable_Trigger]
on [dbo].[MyTable]
for insert, update, delete
as
begin
set nocount on;
declare @ColumnsUpdated varbinary(10) = COLUMNS_UPDATED();
-- Ignore trigger updates
-- Identify specific pattern for trigger update, knowing it may change if the table structure changes
if @ColumnsUpdated = 0x00000000000000008000 return;
-- rest of trigger
end
-
使用
@@NESTLEVEL
您可以使用@@NESTLEVEL
来检测您是在第一次触发调用中还是在后面的触发调用中。对于直接更新,@@NESTLEVEL
将在第一次调用时为 1,在第二次调用中为 2。如果您从存储过程中执行更新,这将增加 - 每个嵌套存储过程一次。
【讨论】:
@@NESTLEVEL
的注释,它也会随着嵌套 SP 的增加而增加。因此,如果一个 SP 调用另一个 SP 调用另一个触发触发器的 SP,则嵌套级别将为 4(或 3?)。
@EzLo 是的,这就是为什么我说如果从 SP 内调用它会增加 - 但我认为 OP 会阅读文档 :)【参考方案2】:
递归触发器
AFTER 触发器不会递归调用自身,除非 RECURSIVE_TRIGGERS 数据库选项已设置。
来自文档:Recursive Triggers
【讨论】:
以上是关于运行后取消主触发器(更新后)触发器类型的主要内容,如果未能解决你的问题,请参考以下文章