触发器是数据库服务器中发生事件时自动执行的一种特殊存储过程。允许为任何特定语句创建多个触发器。它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当对数据库进行操作时就会激活它执行。

触发器分类

分为DML触发器、DDL触发器、登录触发器、嵌套触发器、递归触发器。

DML触发器

定义

在激发任何有效的事件时,将会激发这些触发器,而无论是否会影响任何表行。 

分类

AFTER触发器(之后触发)

对于在 MERGE 语句中指定的每个 INSERT、UPDATE 或 DELETE 操作,将为每个 DML 操作触发相应的触发器。

INSTEAD OF触发器

INSTEAD OF触发器的另一个优点是使您得以编写这样的逻辑代码:在允许批处理的其他部分成功的同时拒绝批处理中的某些部分。

下表对 AFTER 触发器和 INSTEAD OF 触发器的功能进行了比较。

函数 AFTER 触发器 INSTEAD OF 触发器
适用范围 表和视图
每个表或视图包含触发器的数量 每个触发操作(UPDATE、DELETE 和 INSERT)包含多个触发器 每个触发操作(UPDATE、DELETE 和 INSERT)包含一个触发器
级联引用 无任何限制条件 不允许在作为级联引用完整性约束目标的表上使用 INSTEAD OF UPDATE 和 DELETE 触发器。
执行 触发操作 之后:创建 插入的 和 删除的 表
执行顺序 可指定第一个和最后一个执行 不适用
插入的和 删除的表中的 varchar(max) 、 nvarchar(max) 和 varbinary(max) 列引用 Allowed Allowed
插入的和 删除的表中的 text 、 ntext 和 image 列引用。 不允许 Allowed

CLR 触发器

SQL Server存储过程。

应用场景

如果检测到错误(例如,磁盘空间不足),则整个事务即自动回滚。

优点

当约束支持的功能无法满足应用程序的功能要求时,DML 触发器非常有用。

下面的列表比较 DML 触发器和约束,并在 DML 触发器优于约束时进行标识。

  • 除非 REFERENCES 子句定义了级联引用操作,否则 FOREIGN KEY 约束只能用与另一列中的值完全匹配的值来验证列值。

  • DML 触发器可以防止恶意或错误的 INSERT、UPDATE 以及 DELETE 操作,并强制执行比 CHECK 约束定义的限制更为复杂的其他限制。

    例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其他操作,如修改数据或显示用户定义错误信息。

  • DML 触发器可以评估数据修改前后表的状态,并根据该差异采取措施。

  • 一个表中的多个同类 DML 触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的操作来响应同一个修改语句。

  • 如果应用程序需要(或能受益于)使用自定义消息和较为复杂的错误处理,则必须使用触发器。

  • 但是,FOREIGN KEY 约束通常用于此目的。

  • 如果违反了约束,则回滚 INSTEAD OF 触发器操作并且不执行 AFTER 触发器。

DDL触发器

定义

执行 DDL 式操作的系统存储过程也可以激发 DDL 触发器。

分类

Transact-SQL DDL 触发器

例如,如果执行某个语句(如 ALTER SERVER CONFIGURATION)或者使用 DROP TABLE 删除某个表,则激发 DDL 触发器。

CLR DDL 触发器

SQL Server存储过程。

对于影响局部或全局临时表和存储过程的事件,不会触发 DDL 触发器。

DDL 触发器不会创建特殊的 inserted 和 deleted 表。

可以使用 EVENTDATA 函数捕获有关激发 DDL 触发器的事件以及触发器导致的后续更改的信息。

为每个 DDL 事件创建多个触发器。

请改用目录视图。

此文件夹位于相应数据库的 “可编程性” 文件夹下。

应用场景

  • 防止对数据库架构进行某些更改。

  • 希望数据库中发生某种情况以响应数据库架构的更改。

  • 记录数据库架构的更改或事件。

优点

更加安全

通过使用 EVENTDATA( ) 函数,可以在触发器中使用XML信息。

登录触发器

定义

如果身份验证失败,将不激发登录触发器。

应用场景

可以使用登录触发器来审核和控制服务器会话,例如通过跟踪登录活动、限制 SQL Server的登录名或限制特定登录名的会话数。

指定第一个和最后一个触发器

不保证其余触发器的执行顺序。

嵌套触发器

如果一个触发器在执行操作时调用了另外一个触发器,而这个触发器又接着调用了下一个触发器,那么就形成了嵌套触发器。嵌套触发器在安装时就被启用,但是可以使用系统存储过程sp_configure禁用和重新启用嵌套触发器。

注意事项

  • 默认情况下,嵌套触发器配置选项是开启的。
  • 在同一个触发器事务中,一个嵌套触发器不能被触发两次。
  • 由于触发器是一个事务,如果在一系列嵌套触发器的任意层次中发生错误,则整个事物都将取消,而且所有数据回滚。

递归触发器

定义

触发器的递归是指一个触发器从其内部再一次激活该触发器。

分类

SqlServer中的递归触发器包括两种:直接递归和间接递归。

  • 直接递归:触发器被触发后并执行一个操作,而该操作又使用一个触发器再次被触发。
  • 间接递归:触发器被触发并执行一个操作,而该操作又使另一个表中的某个触发器被触发,第二个触发器使原始表得到更新,从而再次触发第一个触发器。

默认情况下,递归触发器选项是禁用的。递归触发器最多只能递归16层,如果递归中的第16个触发器激活了第17个触发器,则结果与发布的rollback命令一样,所有数据都将回滚。

触发器优缺点

优点:

  1、触发器是自动的。当对表中的数据做了任何修改之后立即被激活。

  2、触发器可以通过数据库中的相关表进行层叠修改。

  3、触发器可以强制限制。这些限制比用CHECK约束所定义的更复杂。与CHECK约束不同的是,触发器可以引用其他表中的列。

缺点:

  1、增加了系统的复杂性。

  2、嵌套触发器容易出现死锁现象。

  3、触发器并没有提升多少性能。

  4、可移植性差。

  5、占用服务器资源,给服务器造成压力。

  6、复杂的触发器维护困难。

 

相关文章: