关于SQL Server 2005中触发器的一般性问题。
在什么情况下触发了表触发器以及它们不是什么情况?
要演示的任何代码示例都很棒。
我正在编写一个基于审计的数据库,只是想知道任何可能无法触发我为我的表更新,删除和插入设置的触发器的情况。
我的意思的一个例子,
UPDATE MyTable SET name = 'test rows' WHERE id in (1, 2, 3);
以下语句仅触发更新触发器一次。
答案 0 :(得分:19)
你想什么时候开火?
CREATE TRIGGER AFTER ACTION
在提交操作(insert update delete
)之后运行。 INSTEAD OF
触发触发器代替动作。
触发器最大的问题之一是,无论何时执行某个操作,它们都会触发,即使没有行受影响,也会触发。这不是一个错误,如果你不小心的话,它可以很快燃烧你。
此外,使用触发器,您将使用inserted
和deleted
表。更新的行列在两者中。这会让很多人失望,因为他们不习惯将update
视为delete
然后insert
。
MSDN文档实际上有一个非常深入的讨论,讨论触发器何时触发以及它们具有什么效果here。
答案 1 :(得分:5)
2008年,您可以使用内置的Change Data Capture
此外,触发器不会触发的情况很多,例如:
·表格被删除。
·表格被截断。
·嵌套和/或递归触发器的设置可防止触发器触发。
·数据是批量加载的,绕过触发器。
答案 2 :(得分:3)
以下语句仅触发更新触发器一次。
任何操作类型语句只会触发一次触发器,无论受影响的行数是多少,都必须编写触发器来处理多行插入/更新/删除。
如果您的触发器一次只依赖于插入或删除的伪节点中的一行,则它将失败。更糟糕的是,它不会因错误而失败,它不会影响您想要受触发器影响的所有行。不要通过循环或光标在触发器中修复此问题,而是更改为基于集合的逻辑。触发器中的光标可以使整个应用程序暂停,同时500,000条记录的事务处理并锁定表格数小时。
通过触发器批量插入,除非您指定使用它们。请注意这一点,因为如果你通过触发器让它们通过,你将需要代码来确保触发器中发生的任何事情也发生在批量插入之后。或者您需要使用FIRE_TRIGGERS选项调用批量插入。
答案 3 :(得分:2)
我想我会从链接中突出显示一个触发器无法触发的情况:
虽然TRUNCATE TABLE语句实际上是DELETE,但它无法激活触发器,因为该操作不记录单个行删除。但是,只有那些对表执行TRUNCATE TABLE的权限的人才需要担心无意中绕过带有TRUNCATE TABLE语句的DELETE触发器。