张 宇
武汉软件工程职业学院,湖北 武汉 430033
设计触发器时,理解触发器的工作方式非常重要。在触发器的执行过程中,对每个数据库表会应用到两个临时表:inserted表和deleted表,这是两个仅在内存中的表,结构与定义触发器的表一样,但用户不能直接对表中的数据进行操作,原表中数据的更新过程将经常应用到这两个临时表,各更新操作过程中inserted表和deleted表所起的作用见表1。
表1 数据更新与表的记录
以下以学生数据库为例讨论INSERT触发器、UPDATE触发器、DELETE触发器、INSTEAD OF触发器工作原理及应用。
创建学生成绩数据库st,包含三个表:学生表,课程表和成绩表。
当试图向一个触发器保护的表中插入一行数据时,INSERT触发器将被激活。在插入操作过程中,插入的数据记录在inserted表中,执行插入的过程为:
1)向定义了INSERT触发器的表发送INSERT语句;
2)INSERT语句记录到日志中;
3)执行触发器动作。
当INSERT触发器被激发时,新的数据行被添加到表中,同时被插入数据行的副本也被添加到临时表inserted表中,然后,触发器中定义的语句接着被执行。触发器也可以检查inserted表,确定是否执行触发器动作和如何执行触发器动作。
为学生表创建插入触发器,当在学生表中插入学生时,在成绩表中插入该生所有课程的成绩记录,成绩为NULL。代码如下:
当更新定义有UPDATE触发器的表中的数据时,UPDATE操作将激发对应的触发器,执行更新时,UDPATE语句向deleted表中添加将被更新的行在更新前的原始数据行副本,把更新后的数据行副本添加到inserted表中,然后执行解发器中定义的语句,执行过程为:
1)向表发送UPDATE语句;
2)在日志中以INSERT和DELETE语句方式记录UPDATE语句;
3)触发器可以检查deleted表和inserted表以及被更新的库表,确定是否更新多行以及如何执行触发器动作。在触发器中,可以通过IF UPDATE语句监控特定列数据是否被更新,当被监测列被更新时,触发器可以采取相应的动作。
为学生表创建更新触发器,当更新学生表中学生的学号时,在成绩表中也相应更新该生的学号信息。代码如下:
当试图删除定义了DELETE触发器的表中数据行时,DELETE触发器被激发。DELETE操作在删除数据行时,将被删除行的一个副本插入到deleted表中,执行过程为:
1)向表发送DELETE语句;
2)在日志中记录DELETE语句;
3)执行触发器动作。
在DELETE语句的执行过程中被插入到deleted表中的数据行,不再存在于原数据表中,所以原数据表和deleted表中不会有共同的数据行。
注意:为DELETE语句定义的触发器对TRUNCATE TABLE语句并不执行,因为TRUNCATE TABLE语句不记录到日志中。
为学生表创建删除触发器,当删除学生表中的学生时,成绩表中该生的所有成绩也相应删除。代码如下:
INSTEAD OF触发器取消所有的触发动作,原来的触发动作(插入、更新或删除)不再发生,并执行相应的替代功能。INSTEAD OF触发器增加了可用于表和视图的各种类型的更新操作,当需要使用通常不可更新的视图支持数据修改时,INSTEAD OF触发器可以通过内含SQL语句完成数据的更新操作。
对每一种触发动作,每个表或视图只能有一个INSTEAD OF触发器,但在带有WITH CHECK OPTION定义的视图中不能创建INSTEAD OF触发器。
为学生表创建instead of触发器,当插入学生的年龄小于30时才插入学生表
[1]萨师煊,王珊.数据库系统概论[M].高等教育出版社,2004,1.
[2]王路群.数据库原理与SQL Server教程[M].人民邮电出版社,2006,4.
[3]微软公司.SQL Server 2005数据库开发与实现[M].高等教育出版社,2007,9.