2024年3月9日发(作者:)

SQL

16

SQL

触发器

前面已经介绍过了表、视图、存储过程以及函数的创建。一般而言,创建这些对象后,

需要配置一些对应的操作。例如,执行SELECT语句查询数据,执行EXEC命令执行存储过

程等。SQL也支持自动执行的对象,对数据的更改作出反应,即触发器。

16.1触发器的基本概念

触发器是一种特殊的存储过程,它在表的数据变化时发生作用。触发器可以维护数据完

整性。

16.1.1触发器简介

触发器在数据库里以独立的对象存储,与存储过程不同的是,存储过程通过其他程序来

启动运行,而触发器是由一个事件来启动运行。即当某个事件发生时,触发器自动地隐式运

行。并且,触发器不能接收参数。

触发器对象定义了触发器的特征和被调用时采取的行动。而这些动作是通过一个或多个

SQL语句来实现的。SQL支持3种类型的触发器:INSERT(插入)、UPDATE(更新)和

DELETE(删除)。当向表中插入数据、更新数据或删除数据时,触发器就被调用。通过给表

定义一个或多个触发器,可以指定哪个数据修改时,可以激发触发器。

16.1.2触发器执行环境

触发器执行环境包含了触发器正确执行所必需的信息。这些信息主要是触发器本身的细节

和触发器所定义的目标表。另外,触发器执行环境还包括一个或两个测试表,称之为INSERTED

表和DELETED表。测试表是虚表,用于保存目标表更新、插入或删除的数据信息。

这些测试表用来测试数据修改的结果,以及设置触发器行动的条件。用户不能直接修改

测试表中的数据,但能在SELECT语句中,使用这些表来检测INSERT,UPDATE或DELETE

的结果。各种类型触发器用到的测试表如图16.1所示(针对SQLServer数据库系统而言)。

SQL

trigger表

**

Insered表

新数据

INSERT

DELETE

trigger表

**

trigger表

**

修改的数据

Deleted表

被删除数据

Deleted表

被删除数据

Insered表

新数据(修改

的数据)

UPDATE

16.1

触发器测试表

deleted表存放了DELETE和UPDATE语句中相关行的副本。在DELETE或UPDATE

语句的执行中,这些相关行从trigger表中移到了deleted表中。一般情况下,这两张表

中无共同行。

insertded表存放了INSERT和UPDATE语句中的副本。在INSERT或UPDATE语句的

执行中,这些新行同时被加到inserted表和trigger表中。inserted表中的行是trigger表中

新行的副本。

一个UPDATE效果上等价于一个DELETE再接着一个INSERT。首先“旧”行被复制

到deleted表中,然后新行被复制到trigger表和inserted表中。

16.2SQLServer中的触发器

当对某一表进行操作时,SQLServer就会自动执行触发器所定义的SQL语句,从而确

保对数据的处理必须符合规则。触发器的作用就是保证参照完整性和数据的一致性。

16.2.1SQLServer触发器的种类

SQLServer2000及其以后的版本支持两种类型的触发器:AFTER触发器和INSTEAD

OF触发器。其中AFTER触发器即为前面介绍的UPDATE、INSERT、DELETE触发器。

INSTEADOF触发器表示并不执行其所定义的操作(INSERT、UPDATE、DELETE),

而仅是执行触发器本身。既可在表上定义INSTEADOF触发器,也可以在视图上定INSTEAD

OF触发器,但对同一操作只能定义一个INSTEADOF触发器。

16.2.2使用CREATETRIGGER命令创建触发器

在SQLServer中,可以采用CREATETRIGGER命令创建触发器。语法如下。

CREATETRIGGERtrigger_name

ON{table|view}

[WITHENCRYPTION]

{

{{FOR|AFTER|INSTEADOF}{[DELETE][,][INSERT][,][UPDATE]}

第16章SQL触发器

326