1
数据库原理与应用技术
1.10.4.1 9.4.1 触发器概述
9.4.1 触发器概述

触发器是一种特殊的存储过程,它包括大量的T-SQL语句。但是,触发器又与一般的存储过程有着明显的区别,一般的存储过程可以由用户直接调用执行,而触发器不能被直接调用执行,它只能由事件触发自动执行。

当对某个表进行诸如UPDATE、INSERT和DELETE这些数据记录操作时,SQL Server就会自动执行触发器事先定义好的SQL语句,从而确保输入的数据及对数据的处理必须符合这些SQL语句所定义的规则,减少输入数据中出现的错误。

1. 触发器的作用

若存储过程像VB中各种事件的处理代码及函数,只是用于处理一些具体的事情,那么触发器的执行过程就像是按钮响应某种事件,当单击按钮时,按钮可以响应用户的单击事件,去执行单击事件的处理代码(存储过程)。

从上面的比喻中可以体会到,触发器的主要作用是能够实现由主键和外键所不能保证的、复杂的参照完整性和数据的一致性,除此之外,触发器还有其他许多不同的功能。

(1) 调用存储过程。

为了响应数据库更新,触发器的操作可以通过一个或多个存储过程来完成相应的操作。

(2) 强化数据条件约束。

触发器能够实现比CHECK子句更为复杂的约束,更适合大型数据库管理系统约束数据的完整性。

(3) 跟踪数据库内数据变化的情况,并判断数据变化是否符合数据库要求。

触发器可以侦测数据库内的操作,而不允许数据库中未经许可的指定更新和变化,使数据库修改、更新操作更安全,数据库运行更稳定。

(4) 级联、并行运行。

触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中,包含对另一个表的数据操作,如删除、更新、插入,而该操作又导致该表上的触发器被触发。

2. 触发器的分类

SQL Server 2012支持的触发器有两类。

1)DML触发器

DML触发器为特殊类型的存储过程,可在发生数据操作语言(DML)事件时自动生效,以便影响触发器中定义的表或视图。DML事件包括INSERT、UPDATE或DELETE语句。DML触发器可用于强制业务规则和数据完整性、查询其他表并包括复杂的 T-SQL语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待,如果检测到错误(例如,磁盘空间不足),则整个事务即自动回滚。

DML触发器的主要优点为:DML触发器可通过数据库中的相关表实现级联更改;DML触发器可以评估数据修改前后表的状态,并根据该差异采取措施;DML触发器可以防止恶意或错误的INSERT、UPDATE及DELETE操作,并强制执行比CHECK约束定义的限制更为复杂的其他限制。与CHECK约束不同,DML触发器可以引用其他表中的列。

DML触发器又可分为两类:AFTER触发器和INSTEAD OF触发器。

(1) AFTER触发器。

在执行INSERT、UPDATE、MERGE或DELETE语句的操作之后执行AFTER触发器。如果违反了约束,则永远不会执行AFTER触发器。因此,这些触发器不能用于任何可能违反约束的处理。对于在MERGE语句中指定的每个INSERT、UPDATE或DELETE操作,将为每个DML操作触发相应的触发器。

以删除记录为例:SQL Server先将要删除的记录存放在删除表里;然后把数据表里的记录删除,再激活AFTER触发器,执行AFTER触发器里的SQL语句。执行完毕之后,删除内存中的删除表,退出整个操作。

注意:AFTER触发器只能定义在表的这一级上,但可以为针对表的同一操作定义多个触发器。可用sp_settriggerorder指定表上第一个和最后一个执行的AFTER触发器。如果同一表上还有其他的AFTER触发器,则这些触发器将以随机顺序执行。

(2) INSTEAD OF触发器。

INSTEAD OF触发器在这些操作进行之前就激活了,并且不再去执行原来的SQL操作,而去运行触发器本身的SQL语句。因此,触发器可用于对一个或多个列执行错误或值检查,然后在插入、更新或删除行之前执行其他操作。

例如,当工资表中小时工资列的更新值超过指定值时,可以将触发器定义为产生错误消息并回滚该事务,或者将记录插入工资表中之前将新记录插入到审核记录。

INSTEAD OF触发器的主要优点是可以使不能更新的视图支持更新。例如,基于多个基本表的视图必须使用INSTEAD OF触发器来支持引用多个表中数据的插入、更新和删除操作。

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

2)DDL触发器

DDL触发器是在响应数据定义语言(Data Definition Language)事件时执行的存储过程。DDL触发器一般用于执行数据库中的管理任务。如审核和规范数据库操作、防止数据库表结构被修改等。

以下几种情况可以使用DDL触发器。

(1) 数据库里的库架构或数据表架构很重要,不允许被修改。

(2) 防止数据库或数据表被误操作而删除。

(3) 在修改某个数据表结构的同时修改另一个数据表的相应的结构。

(4) 要记录对数据库结构操作的事件。