鷹翔宇空

          學(xué)習(xí)和生活

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks

          引自:http://64.233.179.104/search?q=cache:8yAnO65MhwEJ:www.ahetc.gov.cn/cit/200108/06.doc+oracle+%E8%A7%A6%E5%8F%91%E5%99%A8&hl=zh-CN&ct=clnk&cd=2

          Oracle觸發(fā)器在MIS 開(kāi)發(fā)中的應(yīng)用

                              周海濤   吳良剛

          摘要:本文介紹了oracle觸發(fā)器的概念和類(lèi)型,總結(jié)了oracle觸發(fā)器在開(kāi)發(fā)MIS中的應(yīng)用,并提供了實(shí)例以供參考.

          關(guān)鍵詞:MIS 、觸發(fā)器  oracle

          1.引言

              本人在做一個(gè)大型的MIS系統(tǒng)(前臺(tái)用powerbuild工具,后臺(tái)用oracle數(shù)據(jù)庫(kù))時(shí),常碰到一些有關(guān)數(shù)據(jù)冗長(zhǎng)性,批量刪除和動(dòng)態(tài)信息方面的問(wèn)題,由此發(fā)現(xiàn)數(shù)據(jù)庫(kù)觸發(fā)器簡(jiǎn)單易用?,F(xiàn)將有關(guān)開(kāi)發(fā)和應(yīng)用中的一些體會(huì)總結(jié)成文,供同行參考。

          2.觸發(fā)器的概念和類(lèi)型。

              數(shù)據(jù)庫(kù)觸發(fā)器(database triggers)是響應(yīng)插入、更新或刪除等數(shù)據(jù)庫(kù)事件而執(zhí)行的過(guò)程。它定義了當(dāng)一些數(shù)據(jù)庫(kù)相關(guān)事件發(fā)生時(shí)應(yīng)采取的動(dòng)作??捎糜诠芾韽?fù)雜的完整性約束,或監(jiān)控對(duì)表的修改,或通知其它程序,表已發(fā)生修改。它的類(lèi)型有:語(yǔ)句級(jí)觸發(fā)器,以及行級(jí)觸發(fā)器,前者可以在語(yǔ)句執(zhí)行前或執(zhí)行后被觸發(fā)。后者在每個(gè)觸發(fā)語(yǔ)句影響的行觸發(fā)一次。還有before和after觸發(fā)的命令。在insert,update,和delete之前或之后執(zhí)行,引用新舊值進(jìn)行處理。如果需通過(guò)觸發(fā)器設(shè)定插入行中的某列值,則為了訪問(wèn)“新(new)”值,需使用一個(gè)觸發(fā)器before insert,使用after insert則不行。Instead of 觸發(fā)器命令,使用它告訴oracle應(yīng)執(zhí)行什么操作。以上四種大類(lèi)合成14種小類(lèi)(略)。各種觸發(fā)器的執(zhí)行順序如下:


            如果有,最先執(zhí)行語(yǔ)句級(jí)before觸發(fā)器  
            每個(gè)insert,delete,update影響的行;
          1. 如果有,最先執(zhí)行行級(jí)before
          1. 執(zhí)行行的delete或update
          2. 如果有,執(zhí)行行級(jí)after觸發(fā)器

            如果有,執(zhí)行語(yǔ)句級(jí)after觸發(fā)器

          3.使用數(shù)據(jù)庫(kù)觸發(fā)器管理數(shù)據(jù)冗余性

              為了數(shù)據(jù)分析和制作報(bào)表的需要,用戶(hù)在數(shù)據(jù)模型中加入了冗余數(shù)據(jù),應(yīng)使用觸發(fā)器,以保證數(shù)據(jù)的完整性。

              冗余數(shù)據(jù)可以用規(guī)定的 for each row選項(xiàng)的before update觸發(fā)器進(jìn)行管理。update 命令可放在觸發(fā)器中對(duì)所有需要更新的冗余數(shù)據(jù)進(jìn)行更新,如客戶(hù)表和訂單表,訂單表包括客戶(hù)的訂單和客戶(hù)表的冗余信息,客戶(hù)表(customer)的表結(jié)構(gòu):客戶(hù)號(hào)(cu_no)、客戶(hù)名(cu_name)、客戶(hù)地址(cu_address)。訂單表(order)的表結(jié)構(gòu):訂單號(hào)(or_no),客戶(hù)號(hào)(or_no),客戶(hù)名(cu_name),客戶(hù)地址(cu_address),當(dāng)客戶(hù)基表中的數(shù)據(jù)被更新時(shí)更新訂單中的冗余列。語(yǔ)法如下:

                 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.用觸發(fā)器完成數(shù)據(jù)復(fù)制

              如果需求非常有限,可以用數(shù)據(jù)觸發(fā)器從一個(gè)數(shù)據(jù)庫(kù)中向另一個(gè)數(shù)據(jù)庫(kù)復(fù)制數(shù)據(jù),如果數(shù)據(jù)復(fù)制需求僅與數(shù)據(jù)的插入有關(guān),當(dāng)一條記錄插入到一個(gè)數(shù)據(jù)庫(kù)中的某個(gè)基表中時(shí),用戶(hù)還希望把這條記錄插入到一個(gè)遠(yuǎn)程數(shù)據(jù)庫(kù)中,需用create database link語(yǔ)句創(chuàng)建一條到遠(yuǎn)程數(shù)據(jù)庫(kù)的連接,一旦創(chuàng)建了一條數(shù)據(jù)庫(kù)連接后,就可以在基表上創(chuàng)建一個(gè)after insert觸發(fā)器,以把每一條記錄插入到遠(yuǎn)程數(shù)據(jù)庫(kù)中。

              (1)在腳本中創(chuàng)建數(shù)據(jù)庫(kù)連接(database link)bj_ysd_remote基表作為數(shù)據(jù)庫(kù)基表,Bj_ysd_local代表本地?cái)?shù)據(jù)庫(kù)上的源基表。

               Creat database link remote(連接名)

               Connect to bj(帳戶(hù)) indentified by bj(密碼)

               Using ‘:2’;

              (2)復(fù)制記錄

               create or replace trigger trig_ysd(觸發(fā)器名)

               after insert on bj_ysd_local

               for each row

               begin

               insert into bj_ysd_remote@dblink remote

               value(:new.x1,:new.x2,……)/*x1.x2代表字段名*/

               end;

              (3)刪除記錄

                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 x1=:old.x1

                end;

          5.用數(shù)據(jù)庫(kù)觸發(fā)器完成瀑布式刪除操作

              在某些情況下,當(dāng)要?jiǎng)h除一條記錄時(shí),該記錄是與外鍵有關(guān)的另外一張基表上的記錄時(shí),這個(gè)刪除操作必須在模型中進(jìn)行傳遞,否則會(huì)出現(xiàn)大量的冗長(zhǎng)數(shù)據(jù),仍以cumstomer 和order基表為例,當(dāng)從customer中刪除一個(gè)客戶(hù)時(shí),order基表中所有相關(guān)記錄也應(yīng)當(dāng)刪除。

              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.用觸發(fā)器完成動(dòng)態(tài)數(shù)據(jù)的操作

              在涉及如何實(shí)現(xiàn)動(dòng)態(tài)庫(kù)存的問(wèn)題時(shí),可用觸發(fā)器解決。倉(cāng)庫(kù)有驗(yàn)收、出庫(kù)、調(diào)撥、報(bào)廢、退料、讓售等這些數(shù)據(jù)必須與以前的庫(kù)存相加減,才能完成動(dòng)態(tài)庫(kù)存操作。本文僅以驗(yàn)收單觸發(fā)器為例,其它的結(jié)構(gòu)雷同。它們涉及到兩個(gè)基表:bi_ysd(驗(yàn)收單),Bj_kcb(當(dāng)前庫(kù)存表),前者的表結(jié)構(gòu)(rq(日期),ysdh(驗(yàn)收單號(hào)), bjbm(備件編碼),yssl(驗(yàn)收數(shù)量),ysdj(驗(yàn)收單價(jià))),后者的表結(jié)構(gòu)為(bjbm(備件編碼),dqkcl(當(dāng)前庫(kù)存量),dqkcje(當(dāng)前庫(kù)存金額))觸發(fā)器如下:

                create or replace trigger trig_ysd

                after insert or update or delete on bj_ysd

                for each row

                declare rq1 varchar2(8);rq2 varchar2(8);

                /*限于篇幅,yssl1,yssl2,ysdj1,ysdj2,bjbm1,bjbm2,ii聲明略*/

                if inserting or updating then

                    rq1:=:new.rq;bjbm1:=:new.bjbm;yssl1:=:new.yssl;

                    ysdj1:=:new.ysdj;

          select count(*) into ii from bj_dqkcb

          where bjbm=bjbm1;

                    if  ii=0 then

                       insert  into  bj_dqkcb(bjbm,dqkcl,dqkcje)

                       value(bjbm1,yssl1,ysdj1);

                   else

                       update bj_dqkcb

                       set dqkcl=dqkcl+yssl1;

                       dqkcje=dqkcje+yssl1*ysdj1;

                   end if

                end if

                if deleting or updating then

                   rq2:=:old.rq;bjbm2:=:old.bjbm;yssl2:=:old.yssl;

                   ysdj2:=:old.ysdj;

                   update bj_dqkcb

                   set dqkcb=dqkcl-yssl2;

                   dqkcje=dqkcje-yssl2*ysdj2

                end if;

               end ;

          7.結(jié)束語(yǔ)

              數(shù)據(jù)庫(kù)觸發(fā)器在數(shù)據(jù)庫(kù)開(kāi)發(fā)、MIS開(kāi)發(fā)上有很廣泛的應(yīng)用,但經(jīng)驗(yàn)表明,使用過(guò)多的觸發(fā)器將降低整個(gè)數(shù)據(jù)庫(kù)的性能。如果數(shù)據(jù)庫(kù)觸發(fā)器寫(xiě)得不好,它會(huì)很快破壞數(shù)據(jù)庫(kù)的性能,因此,在適當(dāng)?shù)臅r(shí)候使用恰當(dāng)?shù)?B style="COLOR: black; BACKGROUND-COLOR: #a0ffff">觸發(fā)器顯得非常重要。

          參考文獻(xiàn):

          Michael Abbey.機(jī)械工業(yè)出版社.Oracle8初學(xué)者指南,1998

          Joline Morrison.機(jī)械工業(yè)出版社.Oracle8數(shù)據(jù)庫(kù)指南,1999 

          Tile:The applications of the oracle triggers in the development of MIS

          Abstract:the paper introduces the concept and types of the oracle triggers,summarizes the applications of the oracle triggers in the MIS,and provides the examples for reference.

          Key words:oracle   trigger

          posted on 2006-02-27 13:23 TrampEagle 閱讀(482) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): datebase
          主站蜘蛛池模板: 九江县| 韶关市| 玛多县| 大渡口区| 靖安县| 基隆市| 沿河| 南投县| 林甸县| 武宁县| 民和| 新化县| 磐安县| 河曲县| 大理市| 乌海市| 自治县| 浑源县| 恩平市| 乌苏市| 苏尼特右旗| 舟山市| 三明市| 安乡县| 双流县| 通渭县| 宝应县| 龙山县| 连平县| 眉山市| 洛扎县| 若尔盖县| 太白县| 安顺市| 常山县| 大埔区| 天门市| 和顺县| 阆中市| 宣城市| 广宗县|