FOR和AFTER触发器有什么区别?

144

FORAFTER触发器有什么区别?


6
+1:我阅读了SQL Server Books Online上的触发器文章,最终得出了完全相同的问题。 - pfunk
我发现这篇文章很有用:http://www.dotnettricks.com/learn/sqlserver/after-trigger-instead-of-trigger-example - Matt
3个回答

186

没有区别,它们做的是同样的事情。

CREATE TRIGGER trgTable on dbo.Table FOR INSERT,UPDATE,DELETE

等同于

CREATE TRIGGER trgTable on dbo.Table AFTER INSERT,UPDATE,DELETE

一个 INSTEAD OF 触发器不同于其他触发器,它在插入之前而且代替插入时触发,并且可以用于视图上,以便将适当的值插入到基础表中。


17
我喜欢关于使用触发器在视图中插入数据的评论,非常有用的信息。干杯。 - Mariusz
对不起,@Ben先生,请问在视图中进行插入操作的场景是什么?谢谢 ^-^ - Jeancarlo Fontalvo
1
@JeancarloFontalvo,1)兼容性。只要视图保持不变,底层表格可以更改。2)访问控制,某些用户只能写入特定列的权限。 - Ben

23

@Ben 是完全正确的。

这里有一篇微软的 MSDN 文章 探索 SQL Server 触发器

摘自文章的一个段落:

这种语法在早期版本的 SQL Server 中也是可以接受的。但是,现在 SQL Server 2000 中有两种类型的触发器,我更喜欢将 FOR 触发器称为 AFTER 触发器。因此,在本文余下部分中,我将提到 AFTER 或 INSTEAD OF 触发器。

与之前看到的 AFTER 触发器类似,这个触发器防止对 lastname 字段进行更改。但是,它实现了比前一个示例不同的业务规则。由于 INSTEAD OF 触发器代替 UPDATE 语句执行,因此 INSTEAD OF 触发器随后评估业务规则测试是否通过。如果业务规则测试通过,则 INSTEAD OF 触发器必须明确再次调用 UPDATE 语句才能进行更新。


7

AFTER指定DML触发器仅在触发SQL语句中指定的所有操作成功执行后才会被触发。在触发此触发器之前,所有参照级联操作和约束检查也必须成功。

当只有FOR关键字被指定时,AFTER是默认选项。

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

INSTEAD OF指定DML触发器在触发SQL语句之前执行,因此覆盖了触发语句的操作。不能为DDL或logon触发器指定INSTEAD OF。

https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql


4
这个说法“当仅指定FOR关键字时,AFTER是默认选项。”很令人困惑。他们本可以用更好的措辞表达。 - FMFF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接