什么时候触发火灾,不也当(When do triggers fire and when don

2019-07-31 18:01发布

关于SQL Server 2005中的触发器相当普遍的问题。

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

任何代码示例演示将是巨大的。

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

我的意思为例,

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

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

Answer 1:

当你希望他们开火?

CREATE TRIGGER AFTER ACTION

运行的动作(后insert update delete )被提交。 INSTEAD OF触发扳机动作到位的。

一个与触发器最大的陷阱是他们解雇每当执行一个动作, 即使没有行受到了影响 。 这是不是一个错误,它的东西,可以很快烧你,如果你不小心。

此外,使用触发器,您就可以使用inserteddeleted表。 已更新的行中列出了两者。 这引发了很多人的了,因为它们不是用来思考的update作为delete ,然后insert

MSDN文档实际上有关于何时触发火灾和什么样的影响,他们有一个非常深入的讨论在这里 。



Answer 2:

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

也有相当多的时候触发器不火少数情况下,如:

·A表被删除。

·A表将被截断。

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

·数据是散装加载,绕过触发器。



Answer 3:

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

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

如果触发同时在插入或删除pseudotables是依赖于只有一行,它就会失败。 而且它不会失败,错误糟糕的是,它根本不会影响到你希望受到任何触发做的所有行。 不要通过一个循环或触发游标解决此问题,更改设置为基础的逻辑。 在触发游标可以把你的整个应用,而500000个记录过程的交易戛然而止,并锁定了表小时。

批量插入的通触发,除非你指定使用它们。 意识到这一点,因为如果你让他们路过触发您将需要代码,以确保在触发无论发生什么事也批量插入后会发生。 或者你需要调用批量插入与FIRE_TRIGGERS选项。



Answer 4:

我想我会从埃里克发布情况的链接突出,其中一个触发器不会火:

虽然TRUNCATE TABLE语句实际上是一个DELETE,它不能激活触发器,因为该操作不记录各个行删除。 然而,只有那些对一个表的权限执行TRUNCATE TABLE需要关心无意中回避了delete触发器用TRUNCATE TABLE语句。



文章来源: When do triggers fire and when don't they