10

关于 SQL Server 2005 中触发器的非常普遍的问题。

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

任何要演示的代码示例都会很棒。

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

我的意思的一个例子,

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

以下语句仅触发一次更新触发器。

4

4 回答 4

21

你希望他们什么时候开火?

CREATE TRIGGER AFTER ACTION

insert update delete在提交动作 ( ) 之后运行。INSTEAD OF触发触发器代替动作。

触发器的最大问题之一是,只要执行操作,它们就会触发,即使没有行受到影响。这不是错误,如果您不小心,它会很快烧毁您。

此外,对于触发器,您将使用insertedanddeleted表。更新的行都列在两者中。这让很多人望而却步,因为他们不习惯将 anupdate视为deletethen insert

MSDN 文档实际上对触发器何时触发以及它们在此处产生的影响进行了相当深入的讨论。

于 2009-08-09T05:51:12.753 回答
5

在 2008 上,您可以使用内置的变更数据捕获

此外,触发器不触发的情况也不少,例如:

· 一个表被删除。

· 表被截断。

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

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

于 2009-08-09T21:52:24.290 回答
3

以下语句仅触发一次更新触发器。

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

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

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

于 2009-08-10T21:00:35.667 回答
2

我想我会从链接中突出显示 Eric 发布了一个触发器不会触发的情况:

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

于 2009-08-09T08:12:51.233 回答