其實大家要建立trigger的需求應該都大同小異
無疑地是想要紀錄某table某欄位何時被異動
或是想了解資料被異動的前後狀況
這對於有時候在查些怪異的程式問題是真的很有幫助的呢!
ps 此指令我僅在5.1版本執行成功,
其他版本則需在測試區驗證是否可行喔!
trigger是幹嘛用的?
先簡單介紹一下trigger用意
就英翻中來說,顧名思義他就是一個觸發器
當指定的條件被觸發時,能隨時紀錄table異動情況
無論是程式還是從資料庫管理介面異動(即便是PLSQL)都會被寫進去紀錄檔中
可在INSERT、UPDATE、DELETE前後等情況記錄當下狀態
如何建立trigger呢?
鼎新標準有一個table可供trigger使用
log_file - Trigger 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就建立完成囉!
以上單純個人經驗跟實作分享
若有說明錯誤之處,再請不吝指教!
- Jul 10 Mon 2017 13:52
鼎新 TIPTOP - 加入trigger (適用5.1)
close
文章標籤
全站熱搜
留言列表