<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Junky's IT Notebook

    統(tǒng)計

    留言簿(8)

    積分與排名

    WebSphere Studio

    閱讀排行榜

    評論排行榜

    Oracle觸發(fā)器


    觸發(fā)器的概念和類型
      數據庫觸發(fā)器(database triggers)是響應插入、更新或刪除等數據庫事件而執(zhí)行的過程。它定義了當一些數據庫相關事件發(fā)生時應采取的動作。可用于管理復雜的完整性約束,或監(jiān)控對表的修改,或通知其它程序,表已發(fā)生修改。它的類型有:語句級觸發(fā)器,以及行級觸發(fā)器,前者可以在語句執(zhí)行前或執(zhí)行后被觸發(fā)。后者在每個觸發(fā)語句影響的行觸發(fā)一次。還有before和after觸發(fā)的命令。在insert,update,和delete之前或之后執(zhí)行,引用新舊值進行處理。如果需通過觸發(fā)器設定插入行中的某列值,則為了訪問“新(new)”值,需使用一個觸發(fā)器before insert,使用after insert則不行。Instead of 觸發(fā)器命令,使用它告訴oracle應執(zhí)行什么操作。以上四種大類合成14種小類(略)。各種觸發(fā)器的執(zhí)行順序如下:
      ⑴   如果有,最先執(zhí)行語句級before觸發(fā)器。
      ⑵   每個insert,delete,update影響的行;
       ①  如果有,最先執(zhí)行行級before
       ②  執(zhí)行行的delete或update
       ③  如果有,執(zhí)行行級after觸發(fā)器
      ⑶   如果有,執(zhí)行語句級after觸發(fā)器
      
      1、使用數據庫觸發(fā)器管理數據冗余性
      為了數據分析和制作報表的需要,用戶在數據模型中加入了冗余數據,應使用觸發(fā)器,以保證數據的完整性。
      冗余數據可以用規(guī)定的 for each row選項的before update觸發(fā)器進行管理。update 命令可放在觸發(fā)器中對所有需要更新的冗余數據進行更新,如客戶表和訂單表,訂單表包括客戶的訂單和客戶表的冗余信息,客戶表(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;
      
      2、用觸發(fā)器完成數據復制
      如果需求非常有限,可以用數據觸發(fā)器從一個數據庫中向另一個數據庫復制數據,如果數據復制需求僅與數據的插入有關,當一條記錄插入到一個數據庫中的某個基表中時,用戶還希望把這條記錄插入到一個遠程數據庫中,需用create database link語句創(chuàng)建一條到遠程數據庫的連接,一旦創(chuàng)建了一條數據庫連接后,就可以在基表上創(chuàng)建一個after insert觸發(fā)器,以把每一條記錄插入到遠程數據庫中。
      
      (1)在腳本中創(chuàng)建數據庫連接(database link)bj_ysd_remote基表作為數據庫基表,Bj_ysd_local代表本地數據庫上的源基表。
      
     Creat database link remote(連接名)
     Connect to bj(帳戶) indentified by bj(密碼)
     Using ':2';
      
      (2)復制記錄
      
     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.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;
      
      3、用數據庫觸發(fā)器完成瀑布式刪除操作
      在某些情況下,當要刪除一條記錄時,該記錄是與外鍵有關的另外一張基表上的記錄時,這個刪除操作必須在模型中進行傳遞,否則會出現大量的冗長數據,仍以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;
      
      4、用觸發(fā)器完成動態(tài)數據的操作
      在涉及如何實現動態(tài)庫存的問題時,可用觸發(fā)器解決。倉庫有驗收、出庫、調撥、報廢、退料、讓售等這些數據必須與以前的庫存相加減,才能完成動態(tài)庫存操作。本文僅以驗收單觸發(fā)器為例,其它的結構雷同。它們涉及到兩個基表:bi­_ysd(驗收單),Bj_kcb(當前庫存表),前者的表結構(rq(日期),ysdh(驗收單號), bjbm(備件編碼),yssl(驗收數量),ysdj(驗收單價)),后者的表結構為(bjbm(備件編碼),dqkcl(當前庫存量),dqkcje(當前庫存金額))觸發(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 ;
      
      5、結束語
      數據庫觸發(fā)器在數據庫開發(fā)有很廣泛的應用,但經驗表明,使用過多的觸發(fā)器將降低整個數據庫的性能。如果數據庫觸發(fā)器寫得不好,它會很快破壞數據庫的性能,因此,在適當的時候使用恰當的觸發(fā)器顯得非常重要。

    posted on 2007-06-19 09:37 junky 閱讀(373) 評論(0)  編輯  收藏 所屬分類: Oracle


    只有注冊用戶登錄后才能發(fā)表評論。


    網站導航:
     
    主站蜘蛛池模板: 成年在线观看网站免费| 无码国产精品一区二区免费3p| 成人男女网18免费视频| 亚洲国产电影在线观看| 免费做爰猛烈吃奶摸视频在线观看 | 亚洲福利中文字幕在线网址| 亚洲乱码日产精品一二三| 高清国语自产拍免费视频国产| 亚洲欧美日韩国产精品一区| 四虎成人免费网站在线| 激情无码亚洲一区二区三区 | 成人永久免费福利视频网站| 亚洲国产成人综合精品| 日韩免费观看视频| 一级做受视频免费是看美女| 亚洲人成网站在线播放vr| 99爱免费观看视频在线| 亚洲免费视频播放| 日本免费一二区在线电影| 免费无遮挡无遮羞在线看| 亚洲色偷偷偷鲁综合| 99xxoo视频在线永久免费观看| 亚洲午夜在线一区| 免费一级毛片正在播放| 久久免费香蕉视频| 亚洲视频免费在线播放| 真实乱视频国产免费观看| 一级毛片免费观看不收费| 亚洲v高清理论电影| 在线看片人成视频免费无遮挡| 黄色免费网址大全| 亚洲AV无码国产精品麻豆天美 | 曰批全过程免费视频免费看 | 国产免费69成人精品视频| aa级女人大片喷水视频免费| 亚洲精品免费视频| 日本a级片免费看| 美女视频黄a视频全免费网站色窝 美女被cao网站免费看在线看 | 亚洲精品国产品国语在线| 在线永久看片免费的视频| 免费无码又爽又黄又刺激网站|