程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle觸發器在MIS 開發中的應用

Oracle觸發器在MIS 開發中的應用

編輯:Oracle數據庫基礎
1.引言
  本人在做一個大型的MIS系統(前台用powerbuild工具,後台用Oracle數據庫)時,常碰到一些有關數據冗長性,批量刪除和動態信息方面的問題,由此發現數據庫觸發器簡單易用。現將有關開發和應用中的一些體會總結成文,供同行參考。
  
  2.觸發器的概念和類型
  數據庫觸發器(database triggers)是響應插入、更新或刪除等數據庫事件而執行的過程。它定義了當一些數據庫相關事件發生時應采取的動作。可用於管理復雜的完整性約束,或監控對表的修改,或通知其它程序,表已發生修改。它的類型有:語句級觸發器,以及行級觸發器,前者可以在語句執行前或執行後被觸發。後者在每個觸發語句影響的行觸發一次。還有before和after觸發的命令。在insert,update,和delete之前或之後執行,引用新舊值進行處理。如果需通過觸發器設定插入行中的某列值,則為了訪問“新(new)”值,需使用一個觸發器before insert,使用after insert則不行。Instead of 觸發器命令,使用它告訴Oracle應執行什麼操作。以上四種大類合成14種小類(略)。各種觸發器的執行順序如下:
  
  ⑴   如果有,最先執行語句級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觸發器,以把每一條記錄插入到遠程數據庫中。
  
  (1)在腳本中創建數據庫連接(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,
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved