【发布时间】:2010-11-17 10:30:12
【问题描述】:
我是 SQL 新手。我正在阅读 SQL 中的触发器。我几乎了解了触发器。但是在 DML 触发器中,我们使用 FOR/AFTER 关键字。我没有理解 FOR/AFTER 和我们为什么使用 FOR/AFTER 关键字之间的区别。我已经在 MSDN 上阅读过,但没有得到简单的答案。 谁能解释一下这是什么?
提前致谢。
【问题讨论】:
标签: sql sql-server triggers
我是 SQL 新手。我正在阅读 SQL 中的触发器。我几乎了解了触发器。但是在 DML 触发器中,我们使用 FOR/AFTER 关键字。我没有理解 FOR/AFTER 和我们为什么使用 FOR/AFTER 关键字之间的区别。我已经在 MSDN 上阅读过,但没有得到简单的答案。 谁能解释一下这是什么?
提前致谢。
【问题讨论】:
标签: sql sql-server triggers
使用 FOR 和 AFTER 没有区别。
我相信原始(2000 年之前)语法只使用了 FOR 关键字。但是,当引入INSTEAD OF 触发器时,“FOR”关键字可能看起来很混乱。 “AFTER”更准确地传达了触发器的类型,并且更容易与“INSTEAD OF”区分开来。
如果我们想要转换插入到表中的内容或阻止插入发生,将使用 INSTEAD OF 触发器。
如果我们想根据刚刚发生的情况执行其他任务,则更通常使用 AFTER 触发器。例如,您可以有一个“AFTER DELETE”触发器,它将已删除的行复制到某种存档表中。基本上,在 AFTER 触发器中,您通常仍然希望活动发生。
【讨论】:
【讨论】:
AFTER 触发器在动作发生 之后执行,但仅在它成功时执行,而不是在它由于例如违反约束而失败时执行。 INSTEAD OF 触发器替换了动作,因此也可以阻止动作。
如果我正确地将您的 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 版本更具可读性,仅此而已。
【讨论】:
它们是一样的。请参阅 BOL 的摘录 " 为 |后 AFTER 指定仅当触发 SQL 语句中指定的所有操作都已成功执行时才触发 DML 触发器。在触发此触发器之前,所有引用级联操作和约束检查也必须成功。
当 FOR 是唯一指定的关键字时,AFTER 是默认值。
AFTER 触发器不能在视图上定义。 "
【讨论】:
根据我的观察,DDL 触发器中使用了 FOR,而 DML 触发器中使用了 AFTER。他们有相同的工作方式。
【讨论】: