可靠性数据采集中触发器的应用研究- 无忧电子开发网-技术文章

来源:百度文库 编辑:神马文学网 时间:2024/05/15 21:17:04
可靠性数据采集中触发器的应用研究
发布日期:2005-08-31 浏览数:16 作者:刘丽丽 丁维明 来源:计算机与信息技术

摘要:本文主要介绍了触发器在实际程序开发中的应用与研究,并简单介绍了触发器的各种类型。
关键词:触发器,可靠性,数据采集
1 引言
进行数据库开发时,在客户端所进行的大量数据操作,使得客户端任务增加,系统速度变慢,最终导致系统的不稳定性。为了避免这类问题,在实际应用中,巧妙地利用触发器,将前台的部分工作转移到后台,可以明显提高工作效率,减小误差,增加系统的稳定性与安全性。
2 触发器概念
触发器类似于过程或函数,是响应插入、更新或删除等数据库事件而执行的过程。它定义了当一些数据库相关事件发生时应采取的动作。可用于管理复杂的完整性约束,或监控对表的修改,或自动给其他需要执行操作的程序发信号,表已发生修改。
要调用触发器,必须有触发器事件。触发器事件是指在数据库表上执行的DML操作,如INSERT,UPDATE或DELETE。触发器事件定义了触发器的类型。其类型如表1所示。
表1 触发器类型
类别
取值
说明
语句
INSERT,DELETE,
UPDATE
定义哪种DML语句会使得触发器点火
定时
BEFORE 或AFTER
定义是否在语句执行以前或以后点火触发器
级别
行或语句
如果触发器是行级(row-level)触发器,那么它仅仅对由触发语句影响的每行点火,如果是语句级的,会在语句之前或之后点火。行级触发器由FOR EACH ROW进行标识。
3 触发器在可靠性数据采集中的应用
设备状态及相关数据的收集整理是电厂可靠性管理的一项基础工作,目前可靠性管理人员绝大多数都是通过查阅值长记录,手工摘录相关设备可靠性数据,然后再将数据逐条手工录入到全国统一使用的可靠性管理软件(V1.0)中。这样的手工录入不仅耗费了大量的人力,而且使得数据的准确性也大大降低。
为了解决这一问题,本系统实现了数据的自动化采集。利用程序代替人工,大大的提高了系统的稳定性与安全性,使用户从繁忙的手工抄作中解放了出来,可以有更多时间去从事其他工作。
程序的流程如图2所示(由于本文主要介绍其中在可靠性数据采集中触发器的应用研究,所以其他的技术在此不再详细叙述。系统的前台开发工具为Delphi5,后台数据库为ORCALE):


图2 可靠性数据采集程序流程图
在流程中,有“★修改数据库,置当前状态的结束时间,插入一条新的记录”这一动作。在此动作中,涉及到两张基表:实时数据表(暂命名为JK_A11)和存放主辅机事件数据的数据表(暂命名为JK_JAX)。
采集程序实时地对JK_A11中的相应数据进行检测,一旦发生变化就按照流程中的条件作相应的处理。当数据变化发生的日期与上次数据变化发生日期是相同年月时,利用客户端的程序可以轻松编写;而当两事件发生在不同年月时,为了方便用户进行统计查询,要对其进行划分,例如若从2003-2-12 到2004-3-2 之间系统一直处于运行状态,就要将时间按照月进行分割,即划分成2003-2-12 到2003-2-28;2003-3-1 到2003-3-31;….到最后的2004-3-1 到2004-3-2多条记录。由于涉及到大量数据的存取,在客户端实现要占用太多资源,因此换用行级触发器来实现不同年月的划分工作。
触发器的应用模型如下所示,:
人工输入状态                    自动化采集状态

在实现的过程中,应当注意触发器的使用限制,例如不应读取或修改触发语句的任何变化表,这些表包括触发表自己;不应读取或修改触发表的限制表中的主键、唯一列值或外键列等。
触发器的编写如下所示:
create or replace trigger JK_JA1040TIGGER_CHANGE after insert ON JK. JK_JAX
FOR EACH ROW
DECLARE
labtime date;
BEGIN
if last_day(:new.uss)<>last_day(:new.usd) then
insert into jk.JK_JA1040_fj
values(:new.us,(to_date(to_char(trunc(last_day(:new.uss)),‘yyyy-mm-dd‘)||‘23:59:59‘,‘yyyy-mm-dd hh24:mi:ss‘)-:new.uss)*24,:new.ec,:new.jxgr,:new.jxfy,:new.uss,to_date(to_char(trunc(last_day(:new.uss)),‘yyyy-mm-dd‘)||‘23:59:59‘,‘yyyy-mm-dd hh24:mi:ss‘),:new.fjbm,:new.bz);
select add_months(:new.uss,1) into labtime from dual;
while (labtime<:new.usd) and (last_day(labtime)<>last_day(:new.usd)) loop
insert into jk.JK_JA1040_fj
values(:new.us,(to_date(to_char(trunc(last_day(labtime)),‘yyyy-mm-dd‘)||‘23:59:59‘,‘yyyy-mm-ddhh24:mi:ss‘) -(TO_DATE(TO_CHAR(last_day(TRUNC(add_months(labtime,-1))),‘yyyy-mm-dd hh24:mi:ss‘),‘yyyy-mm-dd hh24:mi:ss‘)+1))*24,:new.ec,:new.jxgr,:new.jxfy,trunc(last_day(add_months(labtime,-1))+1),to_date(to_char(trunc(last_day(labtime)),‘yyyy-mm-dd‘) || ‘ 23:59:59‘,‘yyyy-mm-dd hh24:mi:ss‘),:new.fjbm,:new.bz);
select add_months(labtime,1) into labtime from dual;
end loop;
end if;
if last_day(:new.uss)=last_day(:new.usd) then
insert into jk.JK_JA1040_fj
values(:new.us,0,:new.ec,:new.jxgr,:new.jxfy,:new.usd,:new.usd,:new.fjbm,:new.bz);
end if;
end;
4 结束语
触发器的使用,使得复杂的商业规则得以灵活的实现,给信息系统的实现带来了极大的帮助,值得去学习应用。但同时应该认识到,触发器的维护是一项复杂的工作,在实际开发中,应该合理地加以推广使用,不应盲目地追求瘦客户端肥服务器端的模型开发。
参考文献:
1、   Scott Urman . 机械工业出版社 Orcale8 PL/SQL程序设计
2、   李振华 李贵龙 触发器的几种应用
3、   周海涛 吴良刚 Oracle触发器在MIS 开发中的应用