什么时候触发火灾,不也当
-
12-09-2019 - |
题
关于SQL服务器触发相当普遍的问题,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文档实际上有关于何时触发火灾和一个漂亮的深入讨论,他们有什么作用的此处。
其他提示
下面的语句只有触发更新触发一次。
任何动作类型语句只触发一次扳机不管有多少行受到了影响,必须编写触发器来处理多行插入/更新/删除。
如果您的触发同时在插入或删除pseudotables是依赖于只有一行,它就会失败。而且它不会失败,错误糟糕的是,它根本不会影响到你希望受到任何触发做的所有行。不要通过一个循环或触发游标解决此问题,更改设置为基础的逻辑。在触发游标可以把你的整个应用,而500000个记录过程的交易戛然而止,并锁定了表小时。
通过通批量插入触发,除非指定使用它们。意识到这一点,因为如果你让他们路过触发您将需要代码,以确保在触发无论发生什么事也批量插入后会发生。或者你需要调用批量插入与FIRE_TRIGGERS选项。
我想我会从埃里克发布情况的链接突出,其中一个触发器不会火:
虽然TRUNCATE TABLE语句实际上是一个DELETE,它不能激活触发器,因为该操作不记录各个行删除。然而,只有那些有权限对表执行TRUNCATE TABLE需要关心无意中回避了delete触发器用TRUNCATE TABLE语句。