国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > Oracle > 正文

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

2024-08-29 13:41:03
字體:
供稿:網(wǎng)友

  1.引言
  本人在做一個(gè)大型的MIS系統(tǒng)(前臺(tái)用powerbuild工具,后臺(tái)用Oracle數(shù)據(jù)庫)時(shí),常碰到一些有關(guān)數(shù)據(jù)冗長性,批量刪除和動(dòng)態(tài)信息方面的問題,由此發(fā)現(xiàn)數(shù)據(jù)庫觸發(fā)器簡單易用。現(xiàn)將有關(guān)開發(fā)和應(yīng)用中的一些體會(huì)總結(jié)成文,供同行參考。
  
  2.觸發(fā)器的概念和類型
  數(shù)據(jù)庫觸發(fā)器(database triggers)是響應(yīng)插入、更新或刪除等數(shù)據(jù)庫事件而執(zhí)行的過程。它定義了當(dāng)一些數(shù)據(jù)庫相關(guān)事件發(fā)生時(shí)應(yīng)采取的動(dòng)作。可用于治理復(fù)雜的完整性約束,或監(jiān)控對(duì)表的修改,或通知其它程序,表已發(fā)生修改。它的類型有:語句級(jí)觸發(fā)器,以及行級(jí)觸發(fā)器,前者可以在語句執(zhí)行前或執(zhí)行后被觸發(fā)。后者在每個(gè)觸發(fā)語句影響的行觸發(fā)一次。還有before和after觸發(fā)的命令。在insert,update,和delete之前或之后執(zhí)行,引用新舊值進(jìn)行處理。假如需通過觸發(fā)器設(shè)定插入行中的某列值,則為了訪問“新(new)”值,需使用一個(gè)觸發(fā)器before insert,使用after insert則不行。Instead of 觸發(fā)器命令,使用它告訴oracle應(yīng)執(zhí)行什么操作。以上四種大類合成14種小類(略)。各種觸發(fā)器的執(zhí)行順序如下:
  
  ⑴   假如有,最先執(zhí)行語句級(jí)before觸發(fā)器。
  
  ⑵   每個(gè)insert,delete,update影響的行;
  
  ①  假如有,最先執(zhí)行行級(jí)before
  
  ②  執(zhí)行行的delete或update
  
  ③  假如有,執(zhí)行行級(jí)after觸發(fā)器
  
  ⑶   假如有,執(zhí)行語句級(jí)after觸發(fā)器
  
  3.使用數(shù)據(jù)庫觸發(fā)器治理數(shù)據(jù)冗余性
  為了數(shù)據(jù)分析和制作報(bào)表的需要,用戶在數(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)行更新,如客戶表和訂單表,訂單表包括客戶的訂單和客戶表的冗余信息,客戶表(customer)的表結(jié)構(gòu):客戶號(hào)(cu_no)、客戶名(cu_name)、客戶地址(cu_address)。訂單表(order)的表結(jié)構(gòu):訂單號(hào)(or_no),客戶號(hào)(or_no),客戶名(cu_name),客戶地址(cu_address),當(dāng)客戶基表中的數(shù)據(jù)被更新時(shí)更新訂單中的冗余列。語法如下:
  
  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ù)庫中向另一個(gè)數(shù)據(jù)庫復(fù)制數(shù)據(jù),假如數(shù)據(jù)復(fù)制需求僅與數(shù)據(jù)的插入有關(guān),當(dāng)一條記錄插入到一個(gè)數(shù)據(jù)庫中的某個(gè)基表中時(shí),用戶還希望把這條記錄插入到一個(gè)遠(yuǎn)程數(shù)據(jù)庫中,需用create database link語句創(chuàng)建一條到遠(yuǎn)程數(shù)據(jù)庫的連接,一旦創(chuàng)建了一條數(shù)據(jù)庫連接后,就可以在基表上創(chuàng)建一個(gè)after insert觸發(fā)器,以把每一條記錄插入到遠(yuǎn)程數(shù)據(jù)庫中。
  
  (1)在腳本中創(chuàng)建數(shù)據(jù)庫連接(database link)bj_ysd_remote基表作為數(shù)據(jù)庫基表,Bj_ysd_local代表本地?cái)?shù)據(jù)庫上的源基表。
  
  Creat database link remote(連接名)
  
  Connect to bj(帳戶) 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ù)庫觸發(fā)器完成瀑布式刪除操作
  在某些情況下,當(dāng)要?jiǎng)h除一條記錄時(shí),該記錄是與外鍵有關(guān)的另外一張基表上的記錄時(shí),這個(gè)刪除操作必須在模型中進(jìn)行傳遞,否則會(huì)出現(xiàn)大量的冗長數(shù)據(jù),仍以cumstomer 和order基表為例,當(dāng)從customer中刪除一個(gè)客戶時(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)庫存的問題時(shí),可用觸發(fā)器解決。倉庫有驗(yàn)收、出庫、調(diào)撥、報(bào)廢、退料、讓售等這些數(shù)據(jù)必須與以前的庫存相加減,才能完成動(dòng)態(tài)庫存操作。本文僅以驗(yàn)收單觸發(fā)器為例,其它的結(jié)構(gòu)雷同。它們涉及到兩個(gè)基表:bi­_ysd(驗(yàn)收單),Bj_kcb(當(dāng)前庫存表),前者的表結(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)前庫存量),dqkcje(當(dāng)前庫存金額))觸發(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é)束語
  數(shù)據(jù)庫觸發(fā)器在數(shù)據(jù)庫開發(fā)、MIS開發(fā)上有很廣泛的應(yīng)用,但經(jīng)驗(yàn)表明,使用過多的觸發(fā)器將降低整個(gè)數(shù)據(jù)庫的性能。假如數(shù)據(jù)庫觸發(fā)器寫得不好,它會(huì)很快破壞數(shù)據(jù)庫的性能,因此,在適當(dāng)?shù)臅r(shí)候使用恰當(dāng)?shù)挠|發(fā)器顯得非常重要。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 新郑市| 柏乡县| 若尔盖县| 浮梁县| 牙克石市| 南丰县| 宾阳县| 泰宁县| 同仁县| 图片| 荃湾区| 彩票| 靖边县| 穆棱市| 普陀区| 资中县| 汤原县| 湟中县| 柘荣县| 卢龙县| 会东县| 阜宁县| 海丰县| 沙湾县| 东阿县| 封开县| 特克斯县| 周口市| 安宁市| 台东市| 闻喜县| 平湖市| 靖宇县| 通河县| 怀仁县| 阿合奇县| 灵山县| 丘北县| 宁城县| 泰宁县| 岳阳县|