姚瑾如
摘要:触发器作为一种高效、快捷的数据库技术,被广泛应用到基于B/S结构的网络应用软件的开发中。文章介绍数据库触发器技术的概念、原理,并采集目前触发器在高校信息管理系统中的应用,以及在开发过程中使用触发器所遇到的问题,找出解决问题的方法和今后在使用中应当注意的事项。
关键词:触发器;数据库;高校信息系统
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2012)34-8114-03
广泛的信息共享需求使得数据库技术和Web技术的结合日趋紧密。数据库触发器技术以其高效、快捷的特点,在实践中被广泛使用。该文主要介绍触发器技术在高校信息管理系统中的应用,举例在使用中产生的问题及其采用的解决方法,初步探讨如何正确使用触发器。
1触发器技术概述
1.1触发器概念
存储过程(StoredProcedure)是在大型数据库系统中,将为了实现特定任务而需要多次调用的代码段编写成一组SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来调用执行它。
触发器是建立在表上的特殊的存储过程,它与存储过程的区别在于,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete,update)时就会激活它执行。触发器虽然是基于一个表而创建的,却可以实现数据库中相关表之间的级联修改和自动更新。经常用于加强数据的完整性约束和业务规则等。
在SQLServer2005中,根据SQL语句的不同,触发器可分为DML触发器和DDL触发器【1】。其中,DML触发器是当数据库服务器中发生数据操纵事件时执行的存储过程,DML事件包括在指定表或视图中修改数据的INSERT语句、UPDATE语句或DELETE语句。DDL触发器是在响应数据定义事件时执行的存储过程,主要包括CREATE、ALTER、DROP语句,用于执行数据库中的管理任务【2】。
高校信息管理系统主要采用DML触发器实现数据的完整性。
1.2DML触发器的工作原理
在SQLServer2005里,触发器触发时,系统自动在内存中创建两个特殊的逻辑表:插入表和删除表。它们的结构和触发器所在数据表的结构完全一致,但它们只是建立在数据服务器中的逻辑表,而不是真正存储在数据库中的物理表,只能读取,不能修改。当触发器工作完成时,这两个表也被从内存中删除【2】。
插入表里存放的是更新前的记录:对于插入记录操作来说,插入表里存放的是要插入的数据;对于更新记录操作来说,插入表里存放的是要更新的记录。
删除表里存放的是更新后的记录:对于更新记录操作来说,删除表里存放的是更新前的记录(更新完后即被删除);对于删除记录操作来说,删除表里存入的是被删除的旧记录。如表1所示:
1.3触发器的优点
1)效率高 触发器被提前编译,且使用高速缓存,减少服务器和客户端之间的数据交换,故加快了执行速度,提高了运行效率。
2)节约资源 使用触发器集中存放经常用到的操作,能简化客户端编程,减少网络开销,提高开发效率。
3)修改方便 当服务器端数据或者业务逻辑发生变化时,只需简单地修改触发器的SQL语句,而不必更改应用程序。
4)使用触发器方便维护数据的完整性,保证数据的有效性和安全性。
2 触发器在高校信息管理系统中的应用
在高校信息管理系统中,应用的触发器主要是DML触发器,用以实现以下功能:
2.1自动给表中的字段赋值
例如,在高校管理信息系统中,在系统中录入一条专利成果信息时,利用触发器将系统时间自动赋值给专利信息表里的操作时间字段,用以记录产生的时间。触发器程序如下:
2.2级联删除相关表,保持数据完整性
通常有一些表之间是存在相关联系的,维护一张表的同时也要维护相关联的表。例如在高校信息系统中,专利成果信息表和专利成员表是相关联的,专利信息表中的每一条数据都有相对应的成员信息,如果专利信息表中的数据被删除,则这条数据对应的相关成员表也应该同时被删除。这样既能减少系统中的冗余数据,又能保持数据完整性。触发器程序举例如下:
2.3同步修改相关表字段,保持信息完整性一致
触发器用于更新相关表字段的情况在高校信息管理系统中也同样存在。例如,一个项目申请结题被批准后,要同步更新项目基本信息中的结题状态字段,以保持项目信息的完整性一致,触发器程序如下:
2.4将表中数据自动转存,减少重复工作量
在信息系统中经常会遇到这样的情况,一条数据通过相关审核之后要转入到同一系统中的另外一张表,或者与之相接口的另外一个系统的一张表中,进行其他数据操作。这时,使用触发器,在操作表的某个状态下触发,自动将相关数据转存到另外一张表中,就能够减少工作量,提高效率;并且数据中的字段越多时,这种便捷越明显。例如,在高校信息系统中,一个科研基地建设申请审核通过,批准结论为“批准建设”时,将基地在申请时填写的信息自动转存到基地基本信息表里面,用于以后维护。触发器程序如下:
3应用中的问题及解决
触发器的便捷,使得在开发过程中,一旦遇到操作数据问题时总想通过触发器的方式解决,但是触发器有时会产生无法预料的错误。在高校信息系统开发过程中,笔者也遇到过触发器导致的无法预料的错误。
在高校信息系统中,项目管理模块用来对高校老师参与的科研项目信息进行登记、审核、维护。由于科研项目数目很多,并且关联到科研经费分配和职称评审等重要方面,学校要求给每个项目生成一个有特定规则的项目编号,方面项目的管理。
面对这样一个问题,我们首先想到的是利用触发器,在项目登记审核通过时触发,数据库根据写好的规则生成项目编码,将项目编码存储到项目基本信息表中。思路清晰,且很好实现。
该功能开发完成测试时,触发器能够正常生成项目编码,交付学校使用一段时间后,现场实施人员发现项目编码会出现跳号问题,并且是不定时偶然发生。仔细研究这个问题之后,我们发现使用这个触发器时,我们为了对触发器本表进行了查询和更新,在触发器中加入了pragmaautonomous_transaction(自治事务),正是自治事务的引入,使得触发器在生成项目编号时产生了无法预料的错误。
由于项目编号的生成无可避免的需要查询和更新本表,为了解决该问题,我们放弃使用触发器,改为在程序js代码中callservice,直接在jsp页面中操作数据库,生成项目编码,插入项目表中。对比触发器的实现方式,后者明显增加了代码量,但是安全性更高,也从根本上避免了自治事务引入产生的无法预料错误。为了系统更高的安全性,牺牲一些硬件资源是非常合理和值得的。
4结束语
触发器虽然方便、快捷,但是它也有很多缺点。
首先,触发器容易被忽视。由于触发器是写在数据库里面的,并且一次编译之后就能直接触发使用,在程序中没有调用语句,因此不利于长期的系统维护。
其次,触发器使用安全性较低。在日常的开发中,我们的代码是和配置库关联的,修改前要签出,修改后要签入,使用前要更新代码,修改还可以撤销,配置库上也会保留历史修改版本,这样保证了代码的一致性和修改不会丢失,也方便维护。但是我们修改触发器时,只能先备份到本地,每次修改都要备份,时间久了以前修改的备份还会丢失,不利于维护和代码的安全性。
再有,触发器还会产生难以预料的错误;在触发器中,查询和更新本表是被禁止的,但是很多时候都要查询、更新本表,所以我们引入“自治事务”来实现查询、更新本表的功能,但在使用过程中却会产生无法预料的错误。
相比而言,存储过程就要稳定和安全很多。存储过程在程序中有调用接口,开发人员在日后维护系统时就能够明确的知道什么地方采用了存储过程。和触发器相类似,存储过程也能够节约很多系统资源。业务逻辑变化时也能够在不大量修改代码的情况下,只修改自身的方法规则,就能快速的响应需求变化。所以在高校信息系统中,我们很多时候可以用存储过程来代替触发器,实现很多数据操作。
参考文献:
[1]刘智勇.SQLserver2005宝典[M].北京:电子工业出版社,2007.
[2]肖海蓉.触发器技术在数据库系统开发中的应用研究[J].电脑开发与应用,2011,24(7):36-38.
[3]郑阿奇.SQLserver2008应用实践教程[M].北京:电子工业出版社,2010.