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的主要内容,如果未能解决你的问题,请参考以下文章

如何从 PL/SQL 中的触发器回滚列

sql 触发器在将列名存储在变量中并将其用于 sql 触发器中的 OLD.myvar 时出现错误

PL/SQL 中的触发器

Java中的SQL触发器调用函数

如何通过 PL/SQL 中的触发器发送电子邮件

与 SQL 数据库中的触发器触发相关的查询?