代码之家  ›  专栏  ›  技术社区  ›  Nathan W

什么时候触发,什么时候不触发

  •  8
  • Nathan W  · 技术社区  · 16 年前

    关于SQLServer2005中触发器的一般性问题。

    在什么情况下触发表触发器,在什么情况下不触发?

    任何代码示例都可以演示。

    我正在编写一个基于审计的数据库,只是想了解可能不会触发我为更新、删除和插入表而设置的触发器的任何情况。

    我的意思的一个例子,

    UPDATE MyTable SET name = 'test rows' WHERE id in (1, 2, 3);
    

    4 回复  |  直到 16 年前
        1
  •  21
  •   Graeme    9 年前

    你想让他们什么时候开火?

    CREATE TRIGGER AFTER ACTION
    

    在动作之后运行( insert update delete )承诺。 INSTEAD OF

    触发器最大的问题之一是,每当执行某个操作时,触发器都会触发, 即使没有行受到影响

    此外,对于触发器,您将使用 inserted deleted 桌子。更新的行列在两个列表中。这让很多人感到厌烦,因为他们不习惯思考 update 作为一个 delete 然后 insert .

    MSDN文档实际上对触发火灾的时间和影响进行了相当深入的讨论 here

        2
  •  5
  •   A-K    16 年前

    Change Data Capture

    还有很多情况下触发器不会触发,例如:

    ·表被截断。

    ·嵌套和/或递归触发器的设置可防止触发器触发。

    ·数据是批量加载的,绕过触发器。

        3
  •  3
  •   HLGEM    16 年前

    下面的语句只触发一次update触发器。

    任何操作类型语句只触发一次触发器,无论有多少行受到影响,都必须写入触发器以处理多行插入/更新/删除。

    如果触发器一次只依赖于插入或删除的伪表中的一行,那么它将失败。更糟糕的是,它不会因错误而失败,它不会影响您希望受触发器影响的所有行。不要通过触发器中的循环或光标来修复此问题,请更改为基于集合的逻辑。触发器中的光标会使整个应用程序突然停止,而一个500000条记录的事务会处理并将表锁定数小时。

    大容量插入旁路触发器,除非指定使用它们。请注意这一点,因为如果让它们绕过触发器,则需要代码来确保触发器中发生的任何事情在大容量插入之后也会发生。或者您需要使用FIRE_触发器选项调用批量插入。

        4
  •  2
  •   Cory    16 年前

    我想我应该从Eric发布的链接中强调一个触发器无法触发的情况:

    尽管TRUNCATE TABLE语句实际上是DELETE,但它无法激活触发器,因为该操作不会记录单个行的删除。但是,只有那些对表具有执行TRUNCATE表的权限的人才需要担心使用TRUNCATE table语句无意中绕过DELETE触发器。