APP下载

浅谈SQL Server触发器之使用

2014-12-16孟庆芳

电脑知识与技术 2014年32期
关键词:触发器工作过程维护

孟庆芳

摘要:在SQL Server数据库中为了对数据库表实施复杂的完整性约束,触发器是比较理想的选择工具。它可以对数据库表进行级联修改,保持数据的一致性。它的执行是由事件来触发,当对一个表进行插入、更新、删除操作时就会激活它执行,从而通过触发器的执行更好地实现数据的完整性约束和业务规则等。

关键词:SQL Serve;数据库;触发器;工作过程;维护

中图分类号:TP313 文献标识码:A 文章编号:1009-3044(2014)32-7582-03

Abstract: In the SQL Server database to form the integrity constraints on the database to implement complex, the trigger is ideal selection tool. It can be cascaded to modify the database table, the maintenance of data consistency. It is implemented by the event to trigger, when on a table to insert, update, delete operations will activate it execution, thus through the execution of triggers to better achieve the integrity constraints andbusiness rules, data etc..

Key words: SQL Serve; database; triggers; work process; maintain

在数据库管理系统中,常常会进行数据的插入、更新、删除等操作,在此操作过程中保持数据的完整性是非常重要的一项工作。当一些普通的维护方法不能满足要求时我们就要考虑用到触发器了。

1 触发器的特点

触发器是一种特殊的存储过程,其特殊性在于它并不需要由用户来直接调用,而是在对表或视图进行插入记录、更改记录或者删除记录时自动执行的。

2 触发器的使用场合

实现对相关表的级联修改;拒绝或回滚违反引用完整性的操作;完成比CHECK约束更复杂的限制;检查修改前后表中数据的不同并执行相应的操作。

3 触发器3种操作的实现过程

DML触发器在执行过程中可以使用两个特殊的临时表—deleted表和inserted表。这两个表存储于内存中,它们在结构上与触发器所在的表的结构相同。

deleted表用于存储delete、update语句所影响的行的副本。在执行delete或update语句时,数据行从触发器表中删除,并传输到deleted表中。

inserted表用于存储insert、update语句所影响的行的副本,在一个插入或更新事务处理中,新建行被同时添加到更新操作的表和insered表中。insered表中的行是触发器表中新行的副本。

两个表由系统管理,不允许用户直接对其进行修改,但可以访问。触发器工作完成后,与该触发器相关的这两个表也将被删除。

现通过实例说明触发器的妙用之处:studentinfo数据库包括学生表student(学号SNO,姓名SNAME,系名DEPART,性别SEX,出生日期DDATE)、课程表Course(课程编号CNO,课程名称CNAME)和成绩表score(学号SNO,课程编号CNO,成绩GRADE)

3.1 Insert触发器的工作过程

Insert触发器是当用INSERT语句向表中插入数据时都会执行的触发器。

当触发INSERT触发器时,新的数据行就会被插入到触发器表和inserted表中。inserted表是一个逻辑表,它包含了已经插入的数据行的一个副本。inserted表包含了INSERT语句中已记录的插入动作。inserted表还允许引用由初始化INSERT语句而产生的日志数据。

例如:创建一个触发器。当向student表中插入一条学生记录时引发该触发器,向scores表中插入两行数据。

Use studentinfo

Go

Create trigger insert_score_trigger

On student

For insert as

Set nocount off

Declare @st_no int

Select @stno=学号 from inserted

Insert into score(sno,cno) Values (@st_no,1)

Insert into score(sno,cno) Values (@st_no,2)

Go

Insert into student(sno,sname,depart,sex,ddate)

Values(‘2012001,王平,计算机科学技术,男,1993-3-9)

Select score.sno as 学号,sname as 姓名,course as 课程,score as 成绩

From score as sc inner join student as s on s.sno=sc.sno

Inner join course as c on sc.cno=c.cno

Where sname=王平

go

3.2 DELETE触发器的工作过程

deleted表是一个逻辑表,它存放已被删除数据行的一个副本。当触发delete触发器后,从受影响的表中删除的行将被放置到该特殊的表中。

例如:在student表上创建一个触发器trigger_delete,当删除student表中某个同学的记录信息时,score表中与该同学相关的成绩信息也自动被删除。

Use Studentinfo

Go

if exists (select name from sysobjects

where name=' trigger_delete' and type='tr')

drop trigger trigger_delete

go

create trigger trigger_delete

on student

for delete

as

delete score

where sno=(select sno from deleted)

go

3.3 UPDATE触发器的工作过程

可将UPDATE语句看成两步操作:即捕获数据前像的DELETE语句,和捕获数据后像的INSERT语句。当在定义有触发器的表上执行UPDATE语句时,原始行(前像)被移入到deleted表,更新行(后像)被移入到inserted表。

例如:在course表上创建一个触发器trigger_update,当更新course表中某门课程的记录信息时,score表中与该课程相关的信息也自动被更新。

Use Studentinfo

go

if exists (select name from sysobjects

where name='trigger_update' and type='tr')

drop trigger trigger_update

go

create trigger trigger_update

on course

for update

as

update score

set cno=

(select cno from inserted)

where cno=(select cno from deleted)

go

4 过多的使用触发器会给数据库及应用程序的维护带来困难

SQL server触发器虽然可以用来保障数据的完整性,但我们要有选择的使用才行,一般情况下,较为简单的完整性要求,我们通过规则、约束、默认值就可以解决了,就没有必要使用触发器了。而且两者在运行机制上也是有区别的,规则、约束、默认值这些是在数据更改之前进行数据验证,而触发器是在数据更改之后才进行验证的。

如果我们对触发器过分的依赖,就会造成遍地是程序的情况,因为触发器本身就需要别的程序给它一个触发条件,也就是说至少在两个地方存在着程序,必然影响数据库的结构。

5 结束语

总之,触发器的使用很方便,在保持数据的完整性操作方面比约束、规则等具有更加高效的功能,而且也比较简单。重要的是理解insert、delete、update实现原理及工作过程。虽然触发器功能强大,能够轻松可靠地实现许多复杂的功能,但要慎用。只有合理的使用触发器才会给我们的数据库操作工作带来很大的便利。

参考文献:

[1] 杨得鑫.SQL server 2005开发与应用[M].北京:机械工业出版社.2008.

[2] 李红.数据库原理与应用[M].北京:高等教育出版社.2011.

[3] 李昆.SQL SERVER2005课程设计案例精编[M].北京:中国水利水电出版社,2010.

[4] 何文华.SQL Server 2005应用开发教程[M].北京:电子工业出版社,2010.

猜你喜欢

触发器工作过程维护
主从JK触发器逻辑功能分析
使用触发器,强化安全性
基于工作过程的项目教学法在《药事管理与法规》课程中的应用
基于工作过程的高职实践类课程改革探索
基于专业核心能力的机械类课程开发
发射台中央控制系统典型故障分析及维护
1938年法入侵西沙 日军积极“维护”中国主权
对触发器逻辑功能转换的分析
触发器逻辑功能转换的两种方法