【发布时间】:2011-07-17 11:21:02
【问题描述】:
FOR 和 AFTER 触发器有什么区别?
【问题讨论】:
-
+1:我阅读了关于触发器的 SQL Server 联机丛书文章,最后得到了完全相同的问题
-
我发现这篇文章很有用:dotnettricks.com/learn/sqlserver/…
标签: sql sql-server-2005 triggers
FOR 和 AFTER 触发器有什么区别?
【问题讨论】:
标签: sql sql-server-2005 triggers
没有区别,他们做同样的事情。
CREATE TRIGGER trgTable on dbo.Table FOR INSERT,UPDATE,DELETE
是一样的
CREATE TRIGGER trgTable on dbo.Table AFTER INSERT,UPDATE,DELETE
INSTEAD OF 触发器不同,它在插入之前而不是在插入之前触发,并且可以在视图上使用,以便将适当的值插入到基础表中。
【讨论】:
@Ben 完全正确。
这里是 MSDN 文章Exploring SQL Server Triggers
文章中的一段:
该语法在旧版本的 SQL Server 中也可以接受。但是,既然 SQL Server 2000 中有两种类型的触发器,我更愿意将 FOR 触发器称为 AFTER 触发器。因此,对于本文的其余部分,我将提及 AFTER 或 INSTEAD OF 触发器。
与您之前看到的 AFTER 触发器一样,此触发器可防止对姓氏字段进行更改。但是,它实现此业务规则的方式与前面的示例不同。因为 INSTEAD OF 触发器代替 UPDATE 语句触发,所以 INSTEAD OF 触发器然后评估业务规则测试是否通过。如果业务规则测试通过,为了进行更新,INSTEAD OF 触发器必须再次显式调用 UPDATE 语句。
【讨论】:
AFTER 指定仅当触发 SQL 语句中指定的所有操作都已成功执行时才触发 DML 触发器。在触发此触发器之前,所有引用级联操作和约束检查也必须成功。 当 FOR 是唯一指定的关键字时,AFTER 是默认值。
AFTER 触发器不能在视图上定义。
代替 指定执行 DML 触发器而不是触发 SQL 语句,因此覆盖触发语句的操作。不能为 DDL 或登录触发器指定 INSTEAD OF。
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql
【讨论】: