关于SQL服务器触发相当普遍的问题,2005年。

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

的任何代码实施例以说明将是巨大的。

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

我的意思阿例如,

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

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

有帮助吗?

解决方案

当您希望其触发办?

CREATE TRIGGER AFTER ACTION

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

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

此外,利用触发器,你会使用inserteddeleted表。已更新的行中列出了两者。这将引发很多人的关,因为它们不用于考虑一个update作为delete然后insert

在MSDN文档实际上有关于何时触发火灾和一个漂亮的深入讨论,他们有什么作用的此处

其他提示

在2008年,你可以使用内置的变化数据捕捉

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

·A表被删除。

·A表将被截断。

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

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

  

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

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

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

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

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

  

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top