3.9.1 触发器概述

3.9.1 触发器概述

触发器(Trigger)是一类特殊的存储过程,是一个在增删改表中的数据时执行的存储过程,它的执行不是由程序显式地调用或执行,也不是手工启动,而是通过事件触发时被执行。例如,当对一个表进行增删改操作时,就会激活触发器的执行。

触发器通常可以完成一定的业务规则,如用于约束、规则和默认值的完整性检查,实施完整性和强制执行业务规则等。当某特定事件发生时,如用户向表中插入、修改、删除数据时,触发器内设定的Transact-SQL语句将会被自动执行,从而确保对数据的处理必须符合由这些Transact-SQL语句所定义的规则。触发器可以嵌套,例如,一个触发器可以触发第二个触发器,第二个触发器又可以触发第三个触发器等。默认情况下,系统允许触发器最多嵌套32层。

(1)触发器的优点

使用触发器主要有以下优点:

触发器是自动执行的,在数据库中定义了某个对象之后,或对表中的数据做了某种修改之后立即被激活。

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

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

触发器可以防止恶意的或错误的INSERT、UPDATE以及DELETE操作,并强制执行比CHECK约束定义更为复杂的完整性要求。CHECK约束中不能引用其他表中的属性列,而触发器可以引用。

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

触发器可以确保数据规范化。使用触发器可以维护数据库中记录级数据的完整性。

(2)触发器的分类

按照触发事件的不同,SQL Server提供了3种类型的触发器:DML触发器、DDL触发器和登录触发器。

①DML触发器:当数据库服务器中有数据操纵(DML)事件(如INSERT、UPDATE或DELETE)发生时,触发器中的代码被执行。按照触发器代码执行的时机不同,DML触发器可以分为:AFTER触发器和INSTEAD OF触发器。

AFTER触发器在执行INSERT、UPDATE或DELETE语句的操作之后被激活,如果违反了约束,则永远不会执行AFTER触发器,因此,AFTER触发器不能用于任何可能防止违反约束的处理。AFTER触发器只能在表上定义,不能在视图上定义。

INSTEAD OF触发器替代激活触发器的DML操作执行,即INSERT、DELETE、UPDATE操作不再执行,取而代之的是INSTEAD OF触发器中的代码,INSTEAD OF触发器可以定义在表上,也可以定义在视图上。

②DDL触发器:DDL触发器将为了响应各种数据定义语言事件而激活,这些事件主要与关键字CREATE、ALTER、DROP、GRANT、DENY、REVOKE等开头的Transact-SQL语句对应。执行DDL式操作的系统存储过程也可以触发DDL触发器。使用DDL触发器可以防止对数据库架构进行的某些更改或记录数据库架构中的更改或事件。

③登录触发器:登录触发器是为了响应LOG ON事件而激活的触发器,与SQL Server实例建立用户会话时将触发该事件。登录触发器在登录的身份验证阶段完成之后且用户会话实际建立之前触发。因此,所有源自触发器内部且通常会传递给用户的信息(如错误消息和来自PRINT语句的消息)会传送到SQL Server错误日志。如果身份验证失败,登录触发器将不会被触发。可以使用登录触发器来审核和控制服务器会话,例如通过跟踪登录活动,限制SQL Server的登录名或限制特定登录名的会话数。

(3)DELETED表和INSERTED表

在DM触发器执行的时候会产生两个临时表——DELETED表(删除的表)和INSERTED表(插入的表)。它们的结构和触发器所在的表(此表有时称为“触发器表”)的结构相同,由SQL Server自动创建和管理。用户可以使用这两种驻留在内存的临时表来测试特定数据修改的影响以及设置DML触发器操作条件。对于这两个表中的数据,用户可以读取但是不能修改,触发器执行完成后,系统自动删除这两个表。

DELETED表用于存储DELETE和UPDATE语句所影响的行的副本。在执行DELETE或UPDATE语句的过程中,行从触发器表中删除,并传输到DELETED表中。DELETED表和触发器表通常没有相同的行。

INSERTED表用于存储INSERT和UPDATE语句所影响的行的副本。在执行INSERT或UPDATE语句的过程中,新行会同时添加到INSERTED表和触发器表中。INSERTED表中的行是触发器表中的新行的副本。

UPDATE操作类似于先执行DELETE操作,然后再执行INSERT操作。因此,首先旧行被复制到DELETED表中;然后,新行被复制到触发器表和INSERTED表中。

因此,在对具有触发器的表进行INSERT、UPDATE和DELETE操作时,其操作过程如下:

执行INSERT操作:插入触发器表中的新行被插入INSERTED表中。

执行DELETE操作:从触发器表中删除的行被插入DELETED表中。

执行UPDATE操作:先从触发器表中删除旧行,该旧行被插入DELETED表中,然后再插入新行,插入的新行被插入INSERTED表中。