您现在的位置是:首页
>
触发器的特点 Oracle触发器在MIS 开发中的应用
Oracle触发器在MIS 开发中的应用 1.引言 本人在做一个大型的MIS系统(前台用 ower uild工具 后台用oracle数据库)时 常碰到一些有关数据冗长性 批量删除和动态信息方
Oracle触发器在MIS 开发中的应用

1.引言 本人在做一个大型的MIS系统(前台用powerbuild工具 后台用oracle数据库)时 常碰到一些有关数据冗长性 批量删除和动态信息方面的问题 由此发现数据库触发器简单易用 现将有关开发和应用中的一些体会总结成文 供同行参考 2.触发器的概念和类型 数据库触发器(database triggers)是响应插入 更新或删除等数据库事件而执行的过程 它定义了当一些数据库相关事件发生时应采取的动作 可用于管理复杂的完整性约束 或监控对表的修改 或通知其它程序 表已发生修改 它的类型有 语句级触发器 以及行级触发器 前者可以在语句执行前或执行后被触发 后者在每个触发语句影响的行触发一次 还有before和after触发的命令 在insert update 和delete之前或之后执行 引用新旧值进行处理 如果需通过触发器设定插入行中的某列值 则为了访问 新(new) 值 需使用一个触发器before insert 使用after insert则不行 Instead of 触发器命令 使用它告诉oracle应执行什么操作 以上四种大类合成 种小类(略) 各种触发器的执行顺序如下 ⑴ 如果有 最先执行语句级before触发器 ⑵ 每个insert delete update影响的行 ① 如果有 最先执行行级before ② 执行行的delete或update ③ 如果有 执行行级after触发器 ⑶ 如果有 执行语句级after触发器 3.使用数据库触发器管理数据冗余性 为了数据分析和制作报表的需要 用户在数据模型中加入了冗余数据 应使用触发器 以保证数据的完整性 冗余数据可以用规定的 for each row选项的before update触发器进行管理 update 命令可放在触发器中对所有需要更新的冗余数据进行更新 如客户表和订单表 订单表包括客户的订单和客户表的冗余信息 客户表(customer)的表结构:客户号(cu_no) 客户名(cu_name) 客户地址(cu_address) 订单表(order)的表结构:订单号(or_no) 客户号(or_no) 客户名(cu_name) 客户地址(cu_address) 当客户基表中的数据被更新时更新订单中的冗余列 语法如下 create or replace trigger bj_customer before update on customer for each row begin update order set cu_no=:new cu_no cu_name=:new cu_name cu_address=:new cu_addess where cu_no=:old cu_no end; 4.用触发器完成数据复制 如果需求非常有限 可以用数据触发器从一个数据库中向另一个数据库复制数据 如果数据复制需求仅与数据的插入有关 当一条记录插入到一个数据库中的某个基表中时 用户还希望把这条记录插入到一个远程数据库中 需用create database link语句创建一条到远程数据库的连接 一旦创建了一条数据库连接后 就可以在基表上创建一个after insert触发器 以把每一条记录插入到远程数据库中 ( )在脚本中创建数据库连接(database link)bj_ysd_remote基表作为数据库基表 Bj_ysd_local代表本地数据库上的源基表 Creat database link remote(连接名) Connect to bj(帐户) indentified by bj(密码) Using : ; ( )复制记录 create or replace trigger trig_ysd(触发器名) after insert on bj_ysd_local for each row begin insert into bj_ysd_remote@dblink remote value(:new x :new x ……)/*x x 代表字段名*/ end; ( )删除记录 create or replace trigger trig_ysd_del after delete on bj_ysd_local for each row begin delete from bj_ysd_remote@dblink remote where x =:old x end; 5.用数据库触发器完成瀑布式删除操作 在某些情况下 当要删除一条记录时 该记录是与外键有关的另外一张基表上的记录时 这个删除操作必须在模型中进行传递 否则会出现大量的冗长数据 仍以cumstomer 和order基表为例 当从customer中删除一个客户时 order基表中所有相关记录也应当删除 Create or replace trigger trig_cust Before delete on customer For each row Begin Delete from order Where cu_no=old cu_no End; 6.用触发器完成动态数据的操作 在涉及如何实现动态库存的问题时 可用触发器解决 仓库有验收 出库 调拨 报废 退料 让售等这些数据必须与以前的库存相加减 才能完成动态库存操作 本文仅以验收单触发器为例 其它的结构雷同 它们涉及到两个基表 bi_ysd(验收单) Bj_kcb(当前库存表) 前者的表结构(rq(日期) ysdh(验收单号) bjbm(备件编码) yssl(验收数量) ysdj(验收单价)) 后者的表结构为(bjbm(备件编码) dqkcl(当前库存量) dqkcje(当前库存金额))触发器如下 create or replace trigger trig_ysd after insert or update or delete on bj_ysd for each row declare rq varchar ( );rq varchar ( ); if inserting or updating then rq :=:new rq;bjbm :=:new bjbm;yssl :=:new yssl; ysdj :=:new ysdj; select count(*) into ii from bj_dqkcb where bjbm=bjbm ; if ii= then insert into bj_dqkcb(bjbm dqkcl dqkcje) value(bjbm yssl ysdj ); else update bj_dqkcb set dqkcl=dqkcl+yssl ; dqkcje=dqkcje+yssl *ysdj ; end if end if if deleting or updating then rq :=:old rq;bjbm :=:old bjbm;yssl :=:old yssl; ysdj :=:old ysdj; update bj_dqkcb set dqkcb=dqkcl yssl ; dqkcje=dqkcje yssl *ysdj end if; end ; 7.结束语 数据库触发器在数据库开发 MIS开发上有很广泛的应用 但经验表明 使用过多的触发器将降低整个数据库的性能 如果数据库触发器写得不好 它会很快破坏数据库的性能 因此 在适当的时候使用恰当的触发器显得非常重要 lishixinzhi/Article/program/Oracle/201311/18819
很赞哦! (1071)