运行后取消主触发器(更新后)触发器类型

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

【讨论】:

以上是关于运行后取消主触发器(更新后)触发器类型的主要内容,如果未能解决你的问题,请参考以下文章

调度触发后使用状态

仅当行已更改时,MySQL 才在更新后触发

更新触发器后创建空字符串时出现无法解释的 MySQL 错误 #1064?

完成表中的数据插入后如何触发触发器

突变后的 Apollo 更新不会触发重新渲染

空字符串无法解释的MySQL错误#1064创建更新触发器后?