【问题标题】:How to prevent a trigger to be triggered by another trigger? [duplicate]如何防止一个触发器被另一个触发器触发? [复制]
【发布时间】:2015-03-23 14:21:20
【问题描述】:

我在table1 上有两个跳跳虎:

  1. 更新后触发 #1,它会更新 table1 中的最后修改日期列
  2. 如果col10,则在更新后触发#2,它会在table2 中创建一条日志记录

所以问题是当我将col1 设置为0 时,触发器#2 在table2 中正确创建了记录,但是当触发器#1 再次修改记录时,触发器#2 在@987654330 中创建另一个日志记录@。

我想要的是防止触发器 #2 在触发器 #1 修改任何记录时被触发。

【问题讨论】:

  • 一种方法是检查触发器 #2,除 last modified 之外的任何列是否已更新
  • 有没有办法检查修改了什么?
  • msdn.microsoft.com/en-us/library/ms189799.aspx 查找“测试特定列的 UPDATE 或 INSERT 操作”
  • 检查TRIGGER_NESTLEVEL函数
  • 另一个选项可能首先调查触发器的使用情况。许多(如果不是大多数)触发器可以避免,这将消除这个问题。除了审核它们的使用之外,最好还是尽量减少。

标签: sql sql-server triggers


【解决方案1】:

您可以在第一个触发器在更新之前发出禁用触发器(在某些情况下,更新值,然后重新启用触发器。

在第一个触发器中:

 if (cond1) 
           disable trigger starttrigger2 on table1

    update table1

    enable trigger starttrigger2 on table1

【讨论】:

  • 对不起,但不得不投反对票,这个建议太危险了,不能放手..
  • 向开发人员展示如何禁用触发器这么危险吗?
  • 恕我直言,是的。在多用户、高度事务性的环境中,您无法确定其他人在做什么。有解决由此引起的问题的第一手经验。
  • 也许我应该展示围绕禁用/启用包装事务。除非用户使用服务代理来保存状态而不执行其他任务,否则我看不到这样做的方法。
  • 我看不出事务会如何改变任何东西,除非您处于可序列化模式或使用 TABLOCKX 提示。关键是其他用户将同时在表上执行其他 DML,应该被记录,如果触发器被禁用,则不会发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多