廣告贊助

其實大家要建立trigger的需求應該都大同小異
無疑地是想要紀錄某table某欄位何時被異動
或是想了解資料被異動的前後狀況
這對於有時候在查些怪異的程式問題是真的很有幫助的呢!

ps 此指令我僅在5.1版本執行成功,
  其他版本則需在測試區驗證是否可行喔!


trigger是幹嘛用的?

先簡單介紹一下trigger用意
就英翻中來說,顧名思義他就是一個觸發器
當指定的條件被觸發時,能隨時紀錄table異動情況
無論是程式還是從資料庫管理介面異動(即便是PLSQL)都會被寫進去紀錄檔中
可在INSERT、UPDATE、DELETE前後等情況記錄當下狀態



如何建立trigger呢?

鼎新標準有一個table可供trigger使用
log_fileTrigger Log 資料明細檔


我提供的範例是使用PLSQL這套ORACLE資料庫管理工具
並加上procedure來寫入紀錄檔!
因此除了trigger,還有procedure要被建立喔!

ps若不使用PLSQL,基本上trigger的cmd是不變的,需要找execute的指令來執行。




PLSQL執行步驟

一、建立Procedure

   1. 先檢查一下目前環境下是否已有Procedure & 是否可Work
  

   2. 如果該Procedure圖示尚有一個紅色XX表示未work
  有work ↓             無work ↓
           

   3. 如果未work,則點Execute按鈕執行↓
  (如果有錯誤請排除錯誤後啟動)
  

二、建立trigger

   1. New trigger
 

   2. Enter trigger name
 

   3. Enter command
   4. Execute
 




Procedure/Trigger 指令範例

----------------------------------------------------------------
Procedure Command:
----------------------------------------------------------------
create or replace procedure log_log
(tab log_file.tab%TYPE,
key1 log_file.key1%TYPE,
key2 log_file.key2%TYPE,
key3 log_file.key3%TYPE,
key4 log_file.key4%TYPE,
key5 log_file.key5%TYPE,
col log_file.col%TYPE,
ldate log_file.ldate%TYPE,
luser log_file.luser%TYPE,
ltype log_file.ltype%TYPE,
old_val log_file.old_val%TYPE,
new_val log_file.new_val%TYPE)
is
begin
   if (ltype='upd' and old_val!=new_val) or ltype='ins' or ltype='del' then
      insert into log_file
      (tab,key1,key2,key3,key4,key5,col,ldate, luser,ltype,old_val,new_val)
      values (tab,key1,key2,key3,key4,key5,col,SYSDATE,USER,ltype,old_val,new_val);
   end if;
end log_log;

※ Procedure sys_context函示指令用法:
   xxx log_file.xxx%TYPE := sys_context('userenv','_______')
 ex:  user log_file.luser%TYPE := sys_context('userenv','os_user')
 常見的參數:os_user , db_name , sid , ip_address
 若要查看可參考該網站 http://blog.itpub.net/29997949/viewspace-1613242/
 下SQL執行一下就知道參數意思囉!


----------------------------------------------------------------
Trigger Command:
----------------------------------------------------------------
create or replace trigger ima_upd_trigger
    after update on ima_file  --表示在ima_file被更新後要進行紀錄
    referencing old as o new as n   --舊值用o表示、新值用n表示
    for each row
declare
    -- local variables here
begin
     log_log ('ima',:o.ima01,'','','','','imaxx',SYSDATE,USER,'upd',:o.imaxx,:n.imaxx);
end ima_upd_trigger;


----------------------------------------------------------------
參數說明:   (log_log傳入參數說明)
----------------------------------------------------------------
1.  table name   例如:「ima_file」
2~6.  key1~key5 例如:「ima01」 (※可以記錄該table主鍵值,或必要紀錄之資料)
7.  column name 例如:「imaxx」
8.  異動日期
9.  異動人員
10. 更新狀態   例如:更改=「upd」 新增=「ins」 刪除=「del」
11. 異動前值   例如:「:o.imaxx」
12. 異動後值   例如:「:n.imaxx」
 
※注意,若要帶入該table舊值or新值,前面要記得加冒號「:」)




執行成功後驗證

兩者都建立後 後可在Procedure跟Trigger看到建立成功的狀態

即便以上都成功了
還是建議測試一筆異動,檢查trigger有沒有被正確紀錄
如此一來trigger就建立完成囉!


以上單純個人經驗跟實作分享
若有說明錯誤之處,再請不吝指教!

文章標籤
創作者介紹

你的夢是我的驕傲

Anita 發表在 痞客邦 PIXNET 留言(0) 人氣()