2010-11-17 55 views
4

我是SQL中的新手。我正在阅读关于SQL中的触发器。我已经得到了几乎关于触发器。但在DML触发器中,我们使用FOR/AFTER关键字。我没有得到FOR/AFTER和为什么使用FOR/AFTER关键字之间的区别。我已经阅读了MSDN,但没有得到简单的答案。 任何人都可以解释我是什么?FOR/AFTER在SQL触发器中

在此先感谢。

回答

7

存在使用FOR和之后之间没有区别。

我相信原来的(2000年以前的)语法只使用FOR关键字。但是,当引入INSTEAD OF触发器时,“FOR”关键字可能看起来很混乱。 “AFTER”更准确地表达了触发器的类型,并且更容易与“INSTEAD OF”区分开来。如果我们想改变什么插入表,或防止插入的发生


INSTEAD OF触发器将被使用。

如果我们想根据刚刚发生的情况执行其他任务,则通常会使用AFTER触发器。例如,你可以有一个“AFTER DELETE”触发器,它将已删除的行复制到某种归档表中。基本上,在AFTER触发器中,通常情况下您仍然希望活动发生。

+0

谢谢你的答复。像在相反的触发器,我们可以避免用户编写的脚本,我们可以使用我们的脚本。所以,你能告诉我为什么我们使用FOR | AFTER – 2010-11-17 10:54:11

2

MSDN

后如果发生违反约束触发器是永远不会被执行;因此,这些触发器不能用于可能防止违反约束的任何处理。

而且then

您可以要求通过指定的AFTER或FOR关键字AFTER触发器。由于FOR关键字与AFTER具有相同的效果,因此使用FOR关键字的DML触发器也被归类为AFTER触发器

这似乎没有区别。

+0

谢谢你的回复。像在取代触发器,我们可以避免用户编写的脚本,我们可以使用我们的脚本。所以,你能告诉我为什么我们使用FOR | AFTER – 2010-11-17 10:54:39

+0

好吧,这就是为什么我发布第一个引用。在操作发生后,'AFTER'触发器被执行,但是只有当它成功时,如果由于例如违反约束而失败,则不会执行。 “INSTEAD OF”触发器取代了该动作,因此也可以阻止该动作。 – thomaspaulb 2010-11-17 11:06:04

1

它们是相同的。请参阅BOL “ ” FOR | AFTER AFTER指定只有在触发SQL语句中指定的所有操作都已成功执行时触发DML触发器,所有引用级联操作和约束检查也必须在触发器触发前成功执行

AFTER为默认时FOR是指定的唯一关键字。

AFTER触发器不能在视图上被定义。 “

+0

感谢您的答复。像在而不是触发器,我们可以避免用户编写的脚本,我们可以使用我们的脚本。所以,你能告诉我为什么我们使用FOR |后 – 2010-11-17 10:53:38

2

如果我正确地将您的评论解释为其他答案,您想知道为什么或何时使用“FOR | AFTER”关键字。

很简单:有两种触发器,AFTER触发器和INSTEAD-OF-trigger。
INSTEAD-OF-trigger用于例如插入操作可被写为

create trigger myTrigger on myTable 
INSTEAD OF insert 
begin 
    (... code goes here ...) 
end 

和后触发可被写为任一

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版本,就是这样。

+0

谢谢基督徒:) – 2010-11-17 11:28:03

+0

顺便说一句,你是什么意思,“我们可以避免脚本哪些是用户编写的,我们可以使用我们的脚本“? – 2010-11-17 11:57:23

0

根据我所观察到的,FOR用于DDL触发器,而AFTER用于DML触发器。他们有相同的工作方式。