2009-08-09 42 views
8
关于SQL服务器触发器2005

什么时候引发火灾,没有他们

在什么情况下都表触发解雇,什么情况下都没有他们

相当普遍的问题是什么时候?

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

我正在编写一个基于审计的数据库,只是想知道任何可能无法触发我设置的更新,删除和插入我的表的触发器的情况。

我的意思为例,

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

下面的语句只触发更新触发一次。

+0

我现在了解到他们不在TRUNCATE上触发 - http://stackoverflow.com/questions/2234223/sql-trigger-on-truncate – 2013-12-06 21:09:50

回答

16

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

CREATE TRIGGER AFTER ACTION 

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

触发器最大的问题之一是,无论何时执行操作,它们都会触发,即使没有行受到影响,也会触发。这不是一个错误,如果你不小心,它可以很快烧你。

此外,使用触发器,您将使用inserteddeleted表。两个列出了更新的行。这引发了很多人的关注,因为他们不习惯于将update视为delete,然后insert

MSDN文档实际上有一个非常深入的讨论,关于何时触发器触发和他们有什么影响here

+0

你可以举一个例子来说明触发器如何在没有触发器时产生问题行受到影响?谢谢。 – 2013-12-06 21:10:58

+2

看看这个:http://www.sqlfiddle.com/#!6/be3d3/3。我已经看到触发器计划向人们发送电子邮件。如果您有一个空闲插入或更新很少影响某一行但只是轮询它的记录的进程,那可能会很快将您烧毁。作为一个经验法则,总是检查触发器中的行是否受到影响! – Eric 2013-12-27 04:54:44

+0

我知道这是旧的,但只是投票解释使用插入和删除更新。这与我的触发器设计战斗了几个小时后,保存了我的培根。 – gmaness 2015-04-27 19:13:07

2

我想我会从链接埃里克发布了一个情况,即触发不会火突出:

虽然TRUNCATE TABLE语句实际上是一个DELETE,它不能激活触发器,因为操作不会记录单个行删除。但是,只有那些在表上有权执行TRUNCATE TABLE的用户才需要关注无意中用TRUNCATE TABLE语句绕过DELETE触发器。

5

2008年,您可以使用内置的Change Data Capture

也有当触发器不火了不少情况,如:

·A表被删除。

·表被截断。

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

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

3

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

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

如果触发器一次仅依赖于插入或删除的伪指令中的一行,则它将失败。更糟糕的是,它不会因错误而失败,它不会影响您想要受触发器影响的所有行。不要通过触发器中的循环或光标来修复此问题,请更改为基于集合的逻辑。触发器中的游标可以让您的整个应用程序处于尖锐停顿状态,而500,000条记录的事务处理并将表锁定数小时。

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

相关问题