利用触发器进行数据实时传输的设计与实现

来源:网络(转载) 作者:李锦 韩震宇 刘伟 发表于:2011-08-15 10:40  点击:
【关健词】SQL;数据库;触发器;实时传输;网络通信
利用SQL Server 2000数据库自身的触发器功能,设计了一种数据实时传输的方式,简化了网络通信模块的程序设计,提高了系统的可扩展性和可维护性。

A Design and Implementation of Real-time Data Transmission Using Trigger
  LI Jin1, HAN Zhen-yu1, LIU Wei2
  (1.School of Manufacturing Sci.& Eng., Sichuan University, Chengdu 610065, China; 2.Sany Heavy Industry Co.Ltd, Changsha 410110, China)
  Abstract: The real-time data transmission mode, which is designed by utilizing trigger of SQL Server 2000 database, simplify the program design of the network communication module, and improve the system scalability and maintainability.
  Key words: SQL; database; trigger; real-time transmission; network communication
  某加油集团包含管理中心、加油站、油库三个部分,其中加油站有多个。连锁加油站管理系统的网络通信模块负责三者之间的数据传输,其网络结构图如图1所示。某些数据的传输需要保证一定的实时性,如客户加油完毕后,管理系统通过集线器采集该笔加油数据并写入加油站服务器数据库中,系统要求在短时间(通常为几秒钟)内将该笔加油数据上传到管理中心,便于用户通过Internet网查询加油信息。传统的实现方式是为每个需要上传的数据表增加一列bool类型的字段来标记该条记录是否已上传,同时,在程序中操作数据表的地方编写网络通信代码,而操作该数据表的地方通常不止一处,而且如果增加了新的数据表,就需要重复编写功能相同的代码,这就造成代码编写量的成倍增加,并且造成网络通信代码的随机分散,不便于以后的升级和维护工作。鉴于此,通过对数据上传功能需求的分析,设计了一种利用SQL触发器进行数据实时传输的方式,有效地解决了采用上述传统方式所存在的问题。
  1 SQL触发器介绍
  1.1 SQL触发器的种类
  SQL Server 2000 支持两种类型的触发器:AFTER 触发器和INSTEAD OF 触发器[1]。
  AFTER 触发器只有执行某一操作(INSERT、UPDATE、DELETE)之后,触发器才被激活,且只能在表上定义。对于AFTER 触发器,可以为针对表的同一操作定义多个触发器,并定义哪一个触发器被最先触发,哪一个被最后触发。通常,AFTER 触发器用于监视发生在数据库表格里的数据变化,如果该语句因错误(比如违反约束或语法错误)而失败,触发器将不会被执行。
  INSTEAD OF 触发器并不执行其所定义的操作(INSERT、UPDATE、DELETE),而仅是执行触发器本身。既可在表上定义INSTEAD OF 触发器,也可以在视图上定义INSTEAD OF 触发器,但对同一操作只能定义一个INSTEAD OF 触发器。
  1.2 SQL触发器的工作原理
  触发器是一种特殊的存储过程,其与一般的存储过程最大的区别是:一般的存储过程可以被用户直接调用,而触发器不能被用户直接调用。触发器通常是事务的一部分,一旦执行过程的任何部分失败,数据库将通过T-SQL语言的ROLLBACK TRANSACTION语句回滚,将所做的一切复原,能够有效确保数据的完整性[1]。
  数据库为触发器创建两个由系统维护的逻辑表:Deleted和Inserted表,它们不是存放在数据库中,而是存放在内存中,并且不能被用户直接修改,其结构与被触发器作用的表的结构相同。Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行,Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行,其中Update是先执行Delete操作然后再执行Insert操作[2-3]。SQL Server 2000的两种触发器及触发器中的两个虚拟表是SQL Server中强制业务规则的有力工具[4]。
  触发器是基于一个表而创建的,却可以同时对多个表进行操作,以实现更为复杂的业务逻辑。它可以级联修改数据库中相关的表;可以执行比检查约束更为复杂的约束操作;拒绝或回滚违反了引用完整性的操作;比较表修改前后数据之间的差别,并根据差别采取相应的操作。
  2 利用SQL触发器进行实时传输
  触发器的作用是在发生某种数据库事件时,自动完成一些动作[5]。可以将其类比为编程语言中的事件函数[6]。如果希望在某个操作之后系统可以自动根据条件去执行某种行为,就可以用触发器来实现。合理的触发器设计既可以保护表中的数据,使数据表更加安全,又可以减少前台功能代码编写量,具有事半功倍的效果。可以利用触发器的这个特点设计一种巧妙的方式,使得对数据实时传输的处理变得简单。
  2.1 信息定位表
  设计PositionTable表,该表的作用是保存数据表发生变化时所影响的行的定位信息,其结构如表1所示。
  其中:Id列是标识列,标识自增量为1;TableName是被触发器作用表的表名;SerialName是该表的主键字段名;Serialno是主键字段值;OpType是触发器被触发时,对该表进行的操作类型:1表示Insert,2表示Update,3表示Delete。
  2.2 基于T-SQL语言的触发器设计
  分析连锁加油站管理系统数据实时传输功能的需求,由于是在数据表发生变化时才进行保存所影响的行的定位信息的操作,因此选用AFTER触发器。
  当对数据表进行插入(Insert)、更新(Update)、删除(Delete)操作时,触发器在后台被自动调用执行,将被操作表发生变化时所影响的行的定位信息写入PositionTable表中,触发器的主体设计如下:
  createtriggertr_被触发器作用的表名 on[dbo].[ 被触发器作用的表名]
  afterinsert,delete,update
  as
  setnocounton
  declare@OpTypeint--1:insert,2:update,3:delete
  set@OpType=2--默认为update
  ifnotexists(select1frominserted)set@OpType=3
  ifnotexists(select1fromdeleted)set@OpType=1
declare@Transbit
  if@@TRANCOUNT>0
  set@Trans=1--返回当前连接的活动事务数
  else
  set@Trans=0
  declare @TempSerialno nchar(30)
  declare @TableName nchar(30)
  declare @SerialName nchar(30)
  set @TableName='被触发器作用的表名'
  set @SerialName='主键字段名'
  if ((@OpType=1 or @OpType=2) and @Trans=1)--insert和update
  begin
  declare cursor1 cursor for (责任编辑:南粤论文中心)转贴于南粤论文中心: http://www.nylw.net(南粤论文中心__代写代发论文_毕业论文带写_广州职称论文代发_广州论文网)

顶一下
(1)
100%
踩一下
(0)
0%


版权声明:因本文均来自于网络,如果有版权方面侵犯,请及时联系本站删除.