Sql 如何防止触发器被另一个触发器触发?

Sql 如何防止触发器被另一个触发器触发?,sql,sql-server,triggers,Sql,Sql Server,Triggers,我在表1上有两个跳跳虎: 触发器#1更新后更新表1中上次修改的日期列 如果col1为0则在更新后触发#2,它会在表2中创建日志记录 所以问题是,当我将col1设置为0trigger时,trigger#2会在table2中正确地创建记录,但当trigger#1再次修改记录时,trigger#2会在table2中创建另一个日志记录 我想要的是防止触发器#1修改任何记录时触发触发器#2。您可以在第一个触发器中在更新之前发出禁用触发器(在某些情况下,更新值,然后重新启用触发器) 在第一个触发器中: i

我在
表1上有两个跳跳虎:

  • 触发器#1更新后更新表1中上次修改的日期列
  • 如果
    col1
    0
    则在更新后触发#2,它会在
    表2中创建日志记录
  • 所以问题是,当我将
    col1
    设置为
    0
    trigger时,trigger#2会在
    table2
    中正确地创建记录,但当trigger#1再次修改记录时,trigger#2会在
    table2
    中创建另一个日志记录


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

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

    在第一个触发器中:

     if (cond1) 
               disable trigger starttrigger2 on table1
    
        update table1
    
        enable trigger starttrigger2 on table1
    

    一种方法是检查触发器#2,除了上次修改的之外,是否有任何列被更新有办法检查修改了什么吗?查找“测试更新或将操作插入特定列”检查触发器#另一种方法可能是首先调查触发器的使用情况。许多(如果不是大多数)触发器是可以避免的,这将消除这个问题。除了审核它们的使用情况外,最好应该是最小的。Sry,但不得不否决,这个建议太危险了,不能让它继续下去。向开发人员展示如何禁用触发器是如此危险吗?是的,是的。在多用户、高度事务性的环境中,你不能保证e其他人正在做什么。在解决由它引起的问题方面有第一手的经验。也许我应该展示如何围绕禁用/启用来包装事务。除非用户使用service broker在不执行其他任务的情况下保存状态,否则我看不到这样做的方法。除非您处于可序列化模式,或者使用TABLOCKX提示。关键是其他用户将在同一时间对表执行其他DML,这应该被记录,如果禁用触发器,则不会发生这种情况。