关于SQL Server 2005中的触发器相当普遍的问题。
在什么情况下是表触发器解雇,什么情况下是不是?
任何代码示例演示将是巨大的。
我正在写一个基于审计数据库,只是想知道的可能不火了,我已经设置了更新的触发器,删除和插入我的表的任何情况。
我的意思为例,
UPDATE MyTable SET name = 'test rows' WHERE id in (1, 2, 3);
下面的语句只触发更新触发一次。
关于SQL Server 2005中的触发器相当普遍的问题。
在什么情况下是表触发器解雇,什么情况下是不是?
任何代码示例演示将是巨大的。
我正在写一个基于审计数据库,只是想知道的可能不火了,我已经设置了更新的触发器,删除和插入我的表的任何情况。
我的意思为例,
UPDATE MyTable SET name = 'test rows' WHERE id in (1, 2, 3);
下面的语句只触发更新触发一次。
当你希望他们开火?
CREATE TRIGGER AFTER ACTION
运行的动作(后insert update delete
)被提交。 INSTEAD OF
触发扳机动作到位的。
一个与触发器最大的陷阱是他们解雇每当执行一个动作, 即使没有行受到了影响 。 这是不是一个错误,它的东西,可以很快烧你,如果你不小心。
此外,使用触发器,您就可以使用inserted
和deleted
表。 已更新的行中列出了两者。 这引发了很多人的了,因为它们不是用来思考的update
作为delete
,然后insert
。
MSDN文档实际上有关于何时触发火灾和什么样的影响,他们有一个非常深入的讨论在这里 。
2008年,您可以使用内置的变更数据捕获
也有相当多的时候触发器不火少数情况下,如:
·A表被删除。
·A表将被截断。
·嵌套和/或递归触发器设置防止触发器从触发。
·数据是散装加载,绕过触发器。
下面的语句只触发更新触发一次。
任何动作类型语句只触发一次扳机无论多少行如何受影响,必须编写触发器来处理多行插入/更新/删除。
如果触发同时在插入或删除pseudotables是依赖于只有一行,它就会失败。 而且它不会失败,错误糟糕的是,它根本不会影响到你希望受到任何触发做的所有行。 不要通过一个循环或触发游标解决此问题,更改设置为基础的逻辑。 在触发游标可以把你的整个应用,而500000个记录过程的交易戛然而止,并锁定了表小时。
批量插入的通触发,除非你指定使用它们。 意识到这一点,因为如果你让他们路过触发您将需要代码,以确保在触发无论发生什么事也批量插入后会发生。 或者你需要调用批量插入与FIRE_TRIGGERS选项。
我想我会从埃里克发布情况的链接突出,其中一个触发器不会火:
虽然TRUNCATE TABLE语句实际上是一个DELETE,它不能激活触发器,因为该操作不记录各个行删除。 然而,只有那些对一个表的权限执行TRUNCATE TABLE需要关心无意中回避了delete触发器用TRUNCATE TABLE语句。