魏权利,李丽萍
(青岛科技大学 信息学院,山东 青岛 266061)
随着Internet技术的迅速发展和信息共享需求的不断提高,数据库技术和Web技术的结合日趋紧密,在使用浏览器/服务器结构的网络应用软件开发时,充分利用触发器等数据库技术,可以避免在网络上传输大量的无用信息,极大地提高系统工作效率。本文重点介绍了在健身房会员管理Web应用软件中,触发器技术的实际应用。
触发器是存储在数据库中的独立对象,是现代数据库管理系统中,用于响应数据变化的一种机制,是实现数据维护规则的有效机制。它是一种实施复杂的完整性约束的特殊存储过程,是经过预编译的SQL语句的集合[1]。当对它所保护的数据进行操作(包括插入、删除、更新)时可自动激活,防止对数据进行不正确的、未授权的或不一致的更改。在Web应用程序中使用触发器技术,使相应的数据处理工作在数据库服务器上完成。这可充分发挥数据库服务器的功能,减少网络上的堵塞,提高系统的运行效率。
在设计数据库触发器时,需要定义点火触发器的数据表,并且运行时数据库服务器还要为每个触发器创建两个临时的专用逻辑表:inserted表和deleted表。这两张临时表由系统维护,用户不能直接对其进行操作,存放在服务器的内存中。临时表的数据结构与点火触发器数据表的数据结构相同。当用户对指定的数据表进行操作时,DBMS将自动执行在相应触发器中的SQL语句。触发器完成本次触发任务后,这两张临时表即被删除[2]。
inserted表由于存放的是执行insert或update语句,需要而向该触发器作用的数据表(也可以是点火触发器的数据表)中插入所有新行。在执行插入或更新数据表的同时,也将新的行添加到inserted表中。因此,inserted表的内容是激活触发器的数据表中新行的拷贝。
deleted表由于存放的是执行delete语句,而要从该触发器作用的数据表中删除的所有行。在执行删除操作时,被删除的行从激活触发器的数据表中被移动到deleted表中。因此deleted表的内容和激活触发器的数据表不会有相同的行。
触发器也是一个数据库对象,它与三部分的内容有关:定义数据库中用于点火触发器的数据表(或视图)、激活触发器的数据操作语句和触发器要采取的动作。
触发器可以由Transact-SQL语句创建,也可以通过企业管理器创建。以Transact-SQL语句创建为例,使用CREATE TRIGGER语句,其语法格式如下:
CREATE TRIGGER trigger_name ON table
FOR[INSERT,UPDATE,DELETE]
ASSql_statement
其中:
trigger_name:给出了触发器的名称;
Table:定义触发器的表(或视图);
FOR[INSERT,UPDATE,DELETE]:说明了激活触发器的数据操作语句;
Sql_statement:定义了触发器要采取的动作。
一张表最多可以建立三类触发器,即插入触发器、修改触发器和删除触发器。一张表可以允许建立多个触发器,但一个触发器只能作用于一张表上,但一个触发器可以包含很多动作,执行很多功能。
在开发健身房会员管理系统Web应用软件中,采用了触发器技术。会员的管理通过会员卡的方式进行,根据健身房会员管理软件的数据处理要求,在新会员卡表、会员卡表、会员刷卡明细表这三张数据表上设计完成特定功能的插入式触发器。
新会员卡表(Me_NewCard_table)用于管理待销售的各种类型的新会员卡,管理的数据字段包括卡类型、销售方式、数量、开始和结束卡号等信息。为了动态生成结束卡号和8位数据字符的连续卡号,在该数据表上设计新卡号生成触发器,功能设计思想是根据新会员卡表中提供的卡初始号和所需生成的会员卡数量动态生成结束卡号。其次,将开始和结束卡号做为while语句的循环控制条件动态地生成连续的卡号并插入到新会员卡号表(Me_NewCard_No_table)中,供会员卡销售选号使用。当设置新会员卡页面进行提交将表单数据插入数据库时,该触发器点火完成预定功能。当卡的数量较多时,使用触发器技术便于管理,可有效减少错误。主要程序段如下:
会员卡表(MemberCard_Table表)用于管理已销售的各种类型的会员卡,管理的数据包括会员和所购会员卡的信息。其中会员卡使用有效期字段需在会员购卡时生成。售卡时,页面根据预销售的卡类型,从新会员卡号表中查询卡号数据并将结果绑定在Web服务器DropList控件上供用户选择。为了保证会员卡信息的一致性和完整性,建立会员卡销售触发器,设计思想是根据销售的会员卡类型和销售日期动态生成卡有效期,并添入会员卡表的有效期字段中。在触发器定义的SQL语句中,根据所销售的会员卡类型使用DATEADD函数,生成卡有效期。若是年卡,则在当前销售时间上加一年;若是半年卡,则在销售时间上加六个月;季卡、月卡同理。其次,从新会员卡设置表中删除所销售的相关会员卡卡号,以此保证卡号数据使用的唯一性。关键程序代码如下:
会员通过使用已购置的会员卡进行消费。在前台办理进入手续,通过刷卡操作,对所持会员卡进行有效期的验证。会员刷卡明细表(Me_ConsumDetail_table)用于管理会员的消费信息,数据字段包括会员卡号、刷卡时间等信息。在该数据表上建立会员卡有效期验证触发器。其功能设计思想是:当会员刷卡消费时根据会员卡卡号查询会员卡表,读取该会员卡的卡类型、卡有效时间,获取当前消费时间(Me_Consum_Date)等信息。页面提交将上述数据插入到会员刷卡明细表时,该触发器点火,执行检查会员卡有效期的SQL语句,根据获取的当前消费时间与卡有效时间进行比较。当大于有效期时,利用SQL Server提供的事务管理功能,通过事务控制语句rollback transaction取消此次刷卡消费,并调用raiserror函数抛出已过期异常信息。触发器主要程序如下:
为了能够捕获并处理触发器抛出的异常信息,在global.asax文件中的Application_Error事件中编写出错时处理事件程序,设计思想是使用ASP.NET的Server对象、GetLastError()方法获取异常,用 Response对象向浏览器输出使用javascript客户端脚本语言编写的提示信息,程序如下:
本设计完成的三个触发器之间关系密切,新卡号生成触发器点火触发后,动态生成相关类型的结束卡号和保存在新会员卡号表中连续的卡号集合;当进行会员卡销售时,从新会员卡号表中选定卡号,点火会员卡销售触发器,自动为选定的会员卡建立卡有效期(有效使用时间),同时从新会员卡号表中删除该卡号;当会员使用会员卡刷卡消费时,会员卡有效期验证触发器点火触发,完成有效期的验证,如果过期,页面弹出警告对话框。在健身房会员管理软件中,使用数据库触发器技术,保证了会员卡信息从制卡、销售到使用过程中数据的一致性和完整性。而且,这种一致性和完整性是实时和同步的,有效地提高了前台工作人员的工作效率。软件设计符合用户要求,操作简便,运行正常。
[1]崔巍.数据库系统及应用[M].北京:高等教育出版社,2008.
[2]周汉平.数据库设计及其应用程序开发[M].北京:清华大学出版社,2010.