java學習---oracle的觸發器

1.觸發器的概念和類型

觸發器是一種特殊的存儲過程,它在插入,刪除或修改特定表中的數據時觸發執行,它比數據庫本身標準的功能有更精細和更復雜的數據控制能力。數據庫觸發器有以下作用:

·安全性。可以基於數據庫的值使用戶具有操作數據庫的某種權利

#可以基於時間限制用戶的操作,例如不允許下班後和節假日修改數據庫數據。

#可以基於數據庫中的數據限制用戶的操作,例如不允許股票的價格的升幅一次超過10%。


·審計。可以跟蹤用戶對數據庫的操作。

#審計用戶操作數據庫的語句。

#把用戶對數據庫的更新寫入審計表。

·實現複雜的數據完整性規則。

#實現非標準的數據完整性檢查和約束。觸發器可產生比規則更爲複雜的限制。

與規則不同,觸發器可以引用列或數據庫對象。例如,觸發器可回退任何企圖吃進超過自己保證金的期貨。

#提供可變的缺省值

·實現複雜的非標準的數據庫相關完整性規則。觸發器可以對數據庫中相關的表進行連環更新。例如,在auths表 author_code列上的刪除觸發器可導致相應刪除在其它表中的與之匹配的行。

#在修改或刪除時級聯修改或刪除其它表中的與之匹配的行。

#在修改或刪除時把其它標誌的與之匹配的行設成NULL值。

#在修改或刪除時把其它表中的與之匹配的行級聯設成缺省值。

#觸發器能夠拒絕或回退那些破壞相關完整性的變化,取消試圖進行數據更新的事務。當插入一個與其主鍵不匹配的外部鍵時,這種觸發器會起作用。例如,可以在books.author_code列上生成一個插入觸發器,如果新值與auths.author_code列中的某值不匹配時,插入被回退。

·同步實時地複製表中的數據

·自動計算數據值,如果數據的值達到了一定的要求,則進行特定的處理。例如,如果公司的帳號上的資金低於5萬元則立即給財務人員發送警告數據。


數據庫觸發器(database triggers)是響應插入、更新或刪除等數據庫事件而執行的過程。它定義了當一些數據庫相關時間發生時應採取的動作。可用於管理複雜的完整性約束,或監控對錶的修改,或通知其它程序,表已發生修改。它的類型有:語句級觸發器,以及行級觸發器,前者可以在語句執行前或執行後被觸發。後者在每個觸發語句影響的行觸發一次。還有before和after觸發的命令。在insert,update和delete之前或之後執行,引用新舊值進行處理。如果需通過觸發器設定插入行中的某列值,則爲了訪問“新“值,需使用一個觸發器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,……)/*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

)刪除記錄








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)刪除記錄    

 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;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章