SQL 触发器中的 FOR/AFTER
Posted
技术标签:
【中文标题】SQL 触发器中的 FOR/AFTER【英文标题】:FOR/AFTER in SQL triggers 【发布时间】:2010-11-17 10:30:12 【问题描述】:我是 SQL 新手。我正在阅读 SQL 中的触发器。我几乎了解了触发器。但是在 DML 触发器中,我们使用 FOR/AFTER 关键字。我没有理解 FOR/AFTER 和我们为什么使用 FOR/AFTER 关键字之间的区别。我已经在 MSDN 上阅读过,但没有得到简单的答案。 谁能解释一下这是什么?
提前致谢。
【问题讨论】:
【参考方案1】:使用 FOR 和 AFTER 没有区别。
我相信原始(2000 年之前)语法只使用了 FOR 关键字。但是,当引入INSTEAD OF 触发器时,“FOR”关键字可能看起来很混乱。 “AFTER”更准确地传达了触发器的类型,并且更容易与“INSTEAD OF”区分开来。
如果我们想要转换插入到表中的内容或阻止插入发生,将使用 INSTEAD OF 触发器。
如果我们想根据刚刚发生的情况执行其他任务,则更通常使用 AFTER 触发器。例如,您可以有一个“AFTER DELETE”触发器,它将已删除的行复制到某种存档表中。基本上,在 AFTER 触发器中,您通常仍然希望活动发生。
【讨论】:
谢谢你的回复。就像在触发器中一样,我们可以避免用户编写的脚本,我们可以使用我们的脚本。所以你能告诉我为什么我们使用FOR|AFTER【参考方案2】:来自MSDN:
如果发生约束冲突,则永远不会执行 AFTER 触发器;因此,这些触发器不能用于任何可能防止违反约束的处理。
还有then:
您可以通过指定 AFTER 或 FOR 关键字来请求 AFTER 触发器。因为 FOR 关键字与 AFTER 的作用相同,所以带有 FOR 关键字的 DML 触发器也归类为 AFTER 触发器
似乎没有区别。
【讨论】:
谢谢你的回复。就像在触发器中一样,我们可以避免用户编写的脚本,我们可以使用我们的脚本。所以你能告诉我为什么我们使用FOR|AFTER 嗯,这就是我发布第一个引文的原因。AFTER
触发器在动作发生 之后执行,但仅在它成功时执行,而不是在它由于例如违反约束而失败时执行。 INSTEAD OF
触发器替换了动作,因此也可以阻止动作。【参考方案3】:
如果我正确地将您的 cmets 解释为其他答案,您想知道为什么或何时使用“FOR|AFTER”关键字。
很简单:有两种触发器,AFTER 触发器和 INSTEAD-OF 触发器。 INSTEAD-OF-trigger 用于例如插入动作可以写成
create trigger myTrigger on myTable
INSTEAD OF insert
begin
(... code goes here ...)
end
AFTER-trigger 可以写成任一
create trigger myTrigger on myTable
AFTER insert
begin
(... code goes here ...)
end
或
create trigger myTrigger on myTable
FOR insert
begin
(... code goes here ...)
end
正如 Damien_The_Unbeliever 所提到的,AFTER 关键字比 FOR 版本更具可读性,仅此而已。
【讨论】:
顺便说一句,“我们可以避免用户编写的脚本,我们可以使用我们的脚本”是什么意思?【参考方案4】:它们是一样的。请参阅 BOL 的摘录 " 为 |后 AFTER 指定仅当触发 SQL 语句中指定的所有操作都已成功执行时才触发 DML 触发器。在触发此触发器之前,所有引用级联操作和约束检查也必须成功。
当 FOR 是唯一指定的关键字时,AFTER 是默认值。
AFTER 触发器不能在视图上定义。 "
【讨论】:
谢谢你的回复。就像在触发器中一样,我们可以避免用户编写的脚本,我们可以使用我们的脚本。所以你能告诉我为什么我们使用FOR|AFTER【参考方案5】:根据我的观察,DDL 触发器中使用了 FOR,而 DML 触发器中使用了 AFTER。他们有相同的工作方式。
【讨论】:
以上是关于SQL 触发器中的 FOR/AFTER的主要内容,如果未能解决你的问题,请参考以下文章