一、触发器分类
DDL 触发器将激发,以响应各种数据定义语言 (DDL) 事件。 这些事件主要与以关键字 CREATE、ALTER、DROP、GRANT、DENY、REVOKE 或 UPDATE STATISTICS 开头的 Transact-SQL 语句对应。 执行 DDL 式操作的系统存储过程也可以激发 DDL 触发器。
DML 触发器为特殊类型的存储过程,可在发生数据操作语言 (DML) 事件时自动生效,以便影响触发器中定义的表或视图。 DML 事件包括 INSERT、UPDATE 或 DELETE 语句。 DML 触发器可用于强制业务规则和数据完整性、查询其他表并包括复杂的 Transact-SQL 语句。 将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。 如果检测到错误(例如,磁盘空间不足),则整个事务即自动回滚。
DML触发器又分为 AFTER 触发器与 INSTEAD OF 触发器
AFTER 触发器
在执行 INSERT、UPDATE、MERGE 或 DELETE 语句的操作之后执行 AFTER 触发器。 如果违反了约束,则永远不会执行 AFTER 触发器;因此,这些触发器不能用于任何可能防止违反约束的处理。 对于在 MERGE 语句中指定的每个 INSERT、UPDATE 或 DELETE 操作,将为每个 DML 操作触发相应的触发器。
INSTEAD OF 触发器
INSTEAD OF 触发器替代下列触发语句的标准操作。 因此,触发器可用于对一个或多个列执行错误或值检查,然后在插入、更新或删除行之前执行其他操作。 例如,当在工资表中小时工资列的更新值超过指定值时,可以将触发器定义为产生错误消息并回滚该事务,或在将记录插入工资表中之前将新记录插入到审核记录。 INSTEAD OF 触发器的主要优点是可以使不能更新的视图支持更新。 例如,基于多个基表的视图必须使用 INSTEAD OF 触发器来支持引用多个表中数据的插入、更新和删除操作。 INSTEAD OF 触发器的另一个优点是使您得以编写这样的逻辑代码:在允许批处理的其他部分成功的同时拒绝批处理中的某些部分。
二、AFTER 触发器执行的顺序
通俗理解为instead of触发器是先于入库之前执行的,同一个表上只能有一个instead of触发器;但是可以有多个alter触发器,多个alter处理器执行的先后顺序是怎么样的呢?默认是按照触发器名称的顺序执行的,但是可以通过sql语句的方式设置顺序。
可将与表关联的 AFTER 触发器之一指定为执行每个 INSERT、DELETE 和 UPDATE 触发操作时激发的第一个或最后一个 AFTER 触发器。 在第一个和最后一个触发器之间激发的 AFTER 触发器将按未定义的顺序执行。
sql语句语法为:sp_settriggerorder @triggername = ‘MyTrigger’, @order = ‘first’, @stmttype = ‘UPDATE’
感谢参考材料:
https://docs.microsoft.com/zh-cn/sql/relational-databases/triggers/logon-triggers?view=sql-server-2017
https://blog.csdn.net/daoyuly/article/details/3931025
https://www.cnblogs.com/BinBinGo/p/6431244.html
https://www.cnblogs.com/wghao/archive/2011/05/15/2047221.html