999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Oracle觸發器在日志管理開發中的應用

2008-12-31 00:00:00吳恒亮張巍巍
電腦知識與技術 2008年16期

摘要:本文討論了利用數據庫中的觸發器對日志管理進行設計與實現的方法,是對原來在客戶端軟件中編寫日志管理方法的一種改進,并給出了Oracle9i中的實例演示。

關鍵詞:Oracle;觸發器;日志管理

中圖分類號:TP311文獻標識碼:A 文章編號:1009-3044(2008)16-21186-02

The Application of Oracle Trigger in the Developing of Log Management

WU Heng-liang, ZHANG Wei-wei

(Shandong Business Colloge,Management Science and Engineering Institute,Yantai 264005,China)

Abstract:This article describes a new developing method of log management by the trigger of data base, that is an improvement to the original method of writing log management in the client software, and the article gives the example of application in Oracle9i.

Key words:Oracle; trigger; log management

1 引言

日志對于安全來說非常重要,它記錄了系統每天發生的各種各樣的事情。日志主要的功能有:審計和監測。一方面可以通過它來檢查錯誤發生的原因,或者受到攻擊時攻擊者留下的痕跡。另一方面還可以實時的監測系統狀態,監測和追蹤侵入者等等。

在每一個企業管理信息系統軟件的開發過程中,一般都會涉及到日志管理模塊,因為每個軟件都有各種操作權限的操作人員從事其權限范圍內的操作,我們必須記錄下這些操作的全部歷史記錄,對監測系統運行狀態,為事后監督提供直接依據,對防范系統安全有重要作用。

在開發C/S或B/S模式的系統軟件時,日志管理的一般方法是在客戶端(C/S)或應用服務器(B/S)上對每個功能模塊編寫日志處理子模塊,這種方法編程量比較大,開發效率低,維護起來也比較繁瑣。本文試圖采用數據庫中的觸發器編程,把日志管理全部或部分轉到數據庫中,對比前一種方法可以大大減少編程代碼,降低開發的工作量。

2 觸發器介紹

對表中數據進行修改、刪除或插入是非常常見的操作,當表被修改時,應該自動給其他需要執行操作的程序發信號。觸發器可以完成這一功能,觸發器是存儲在數據庫中的一個與數據表相關聯的存儲過程,當發生insert、update或delete操作時被自動執行,與一般存儲過程的調用方法不同,當某事件的發生引起連環更新或其它的相應操作時,通過自動執行觸發器代碼實現而不用人工干預,大大減輕了維護工作,同時也很好地保證了數據的一致性。

觸發器的優點是自動激發,不管是什么引起數據修改(來自程序的或是來自用戶的),它們都工作,所以常常用于不同數據表中的相關數據的串接修改。采用這種方法實現數據表間接的數據關聯,可以由數據庫集中維護控制,規則變化時只需修改相應的觸發器即可,這樣系統易于維護,提高了工作效率。

本文的基本思想就是利用了這一點,在客戶端軟件每次發出對表的這些操作時自動觸發觸發器,實現日志的記錄。在各種RDBMS中基本都提供了這種程序,本文以Oracle9i為例介紹觸發器的使用方法。

在Oracle9i中,觸發器就是PL/SQL的一種編程結構。下文將簡單介紹一下觸發器的使用方法。

2.1 建立觸發器的主要語法

create [or replace] trigger trigger_name {before|after} event

on {table | view |database}

[for each row[when condition]]

trigger_body

注釋:

trigger_name:觸發器的名字;

event:為insert、update、delete或update of 列名1,列名2…;

on {table | view |database}:觸發器的觸發對象(表、視圖或數據庫);

[for each row]:可選項,使用這個選項時,對每條相應行將引起觸發器觸發;

trigger_body:觸發器觸發時執行的PL/SQL塊。

2.2 觸發器的主要應用

(1)實施表的完整性限制,比如設置數據表的約束條件、參照完整性等。特別是對那些在表創建階段通過聲明限制無法實現的復雜的安全性、完整性限制,比如限制用戶的訪問時間等等;

(2)實現表操作的前處理與后處理,比如表的內容發生變更時,給其它需要運行的程序發信號,采取相應的處理;

(3)實現跨節點表的同步更新,維護同步表的復制;

(4)應用于審計,可以跟蹤表上所實施的數據操作,通過記錄修改內容和修改者來審計表中的信息;

(5)自動生成派生列的值,實現自動獲得列值的功能;

(6)透明的記錄事件,提供透明的事件日志。

3 觸發器在日志管理中的實現

下面的日志管理的實現方法,就是利用了上文提到的觸發器的第四個主要應用,基本思想是在數據庫中對需要做日志的數據表分別建立一個觸發器,該觸發器記錄此時客戶端的操作員、操作對象、操作時間、操作動作等。當在客戶端程序中只要涉及到insert、update或delete等操作時就觸發該觸發器,從而實現日志管理。這種方法避免了程序員在客戶端或中間服務器應用程序的每個模塊中編寫很多重復的程序代碼,在數據庫中建立的觸發器代碼較少,也比較簡單、類似,編寫、維護都比較省時省力。

下面將以Oracle9i提供的示例用戶scott的emp表為例,通過建立觸發器來實現對該數據表的日志管理,對客戶端發出的各種操作進行記錄。具體步驟如下:

步驟一:建立所需要的數據表。

首先要創建兩個表emp_log和cur_user。其中,emp_log表用于記錄操作日志;cur_user表記錄操作客戶端軟件的當前用戶。

需要說明一下,為了在數據庫的觸發器中能夠訪問到客戶端軟件的當前用戶,需要在客戶端軟件的登錄窗口中編寫代碼,記錄當前登錄到系統的用戶,并存入cur_user表,在觸發器中就可以通過訪問cur_user表實現在服務器端的數據庫中對客戶端當前用戶的訪問,當然大家可以嘗試其它方法。代碼如下:

--創建用戶對數據表emp的操作日志表emp_log

create table scott.emp_log(

user_name varchar2(10), --操作員

opera_time date,--操作時間

operator varchar2(8),--操作動作

opera_obj varchar2(20)--操作對象

);

--創建記錄客戶端軟件的當前用戶的數據表cur_user

create table scott.cur_user(

useridvarchar2(6),--操作員標志

usernamevarchar2(10)--當前操作員

);

步驟二:為用戶scott建立一個函數get_operator( ),從cur_user表中取出正在操作客戶端軟件的當前用戶。

create or replace function scott.get_operator

return varchar

as

v_operator scott.cur_user.username%type;

begin

select username into v_operator

from scott.cur_user; -- cur_user表中最多只有一條記錄

return(v_operator); --返回當前用戶

end get_operator;

步驟三:為scott用戶的emp表建立觸發器。

create or replace trigger scott.operator_emp

after insert or delete or update

on scott.emp

for each row --行級

declare

v_user scott.cur_user.username%type;

begin

v_user:=scott.get_operator();--獲得當前操作員

ifinserting then --插入操作

insert into scott.emp_log(user_name,opera_time,operator,opera_obj)

values(v_user,sysdate,'插入','emp表');

elsif updating then--更新操作

insert into scott.emp_log(user_name,opera_time,operator,opera_obj)

values(v_user,sysdate,'更新','emp表');

elsif deleting then--刪除操作

insert into scott.emp_log(user_name,opera_time,operator,opera_obj)

values(v_user,sysdate,'刪除','emp表');

else --其他操作

insert into scott.emp_log(user_name,opera_time,operator,opera_obj)

values(v_user,sysdate,'其他','emp表');

end if;

end;

說明:本觸發器在客戶端程序對scott.emp表執行insert、update或delete之后觸發,其中利用了觸發器的inserting、updating和deleting三個謂詞來幫助判斷執行的是哪種操作(insert、update或delete)。

步驟四:在Oracle9i 的SQL Worksheet中測試觸發器。

set serveroutput on

declare

cursor c_emp

is select user_name,opera_time,operator,opera_objfrom scott.emp_log;

begin

--觸發scott.operator_emp觸發器(一個insert、update和兩個delete操作)

insert into scott.emp(empno,ename,job) values(1209,'王剛','銷售員');

deletefrom scott.emp where empno=1167;

deletefrom scott.emp where empno=1168;

update scott.emp set job='銷售主管' where empno=1189;

commit;--生效

for r_emp in c_emp loop --輸出操作日志emp_log

dbms_output.put_line('用戶名:'||r_emp.user_name);

dbms_output.put_line('操作時間: '||r_emp.opera_time);

dbms_output.put_line('執行操作:'||r_emp.operator);

dbms_output.put_line('操作對象:'||r_emp.opera_obj);

end loop;

end;

4 結束語

本文給出了一個比較簡單的日志管理的演示實例,所做的操作記錄還不夠完整。如果需要更詳細的日志,可以利用觸發器的標識符(:old和:new),記錄用戶插入(insert)的新記錄、刪除(delete)的舊記錄或修改(update)某些字段的前后值的變化,本文不再贅述。

參考文獻:

[1] 于自躍.Oracle9i開發教程[M].北京:北京希望電子出版社,2002.

[2] 王行言.Oracle數據庫應用開發基礎[M].北京:清華大學出版社,2003.

[3] 蔡立軍,瞿亮.關系數據庫Oracle9i原理及應用[M].北京:清華大學出版社,2005.

[4] 李代平.Oracle9i數據庫應用基礎[M].北京:冶金工業出版社,2003.

注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文。

主站蜘蛛池模板: 久久99国产视频| 国产亚洲精品无码专| 中美日韩在线网免费毛片视频| 中文字幕永久视频| aⅴ免费在线观看| 成年人国产网站| 亚洲女同一区二区| 欧美人在线一区二区三区| 色婷婷亚洲综合五月| 91国内外精品自在线播放| 久久精品国产精品一区二区| 97人人做人人爽香蕉精品| 无码AV高清毛片中国一级毛片 | 国产欧美视频在线观看| 欧美福利在线播放| 午夜高清国产拍精品| 日本免费a视频| 国产在线98福利播放视频免费| 欧美成人精品一级在线观看| 国产玖玖玖精品视频| 亚洲Aⅴ无码专区在线观看q| 亚洲欧美一区二区三区蜜芽| 亚洲国产中文综合专区在| 国产在线观看91精品| 亚洲精品亚洲人成在线| 亚洲精品视频网| 天堂亚洲网| 亚洲国产综合精品中文第一 | 色综合成人| 久久亚洲美女精品国产精品| 国产成人亚洲无吗淙合青草| 国产成人1024精品| av一区二区三区高清久久| 白浆视频在线观看| 国产一区二区福利| 国产视频a| 色一情一乱一伦一区二区三区小说| 9啪在线视频| 成人小视频在线观看免费| 欧美日韩91| 幺女国产一级毛片| 日韩人妻少妇一区二区| 亚洲人网站| 韩日无码在线不卡| 日韩在线视频网站| 九色在线观看视频| 久久久久国产一级毛片高清板| 婷婷午夜影院| 99国产精品国产高清一区二区| 在线无码九区| 欧美日韩在线国产| 亚洲中文字幕日产无码2021| 91久久偷偷做嫩草影院电| 免费国产黄线在线观看| 久久综合五月婷婷| a毛片免费看| 玩两个丰满老熟女久久网| 日本成人一区| 热99精品视频| 欧美在线一二区| 久久天天躁狠狠躁夜夜2020一| 97se亚洲综合在线韩国专区福利| 亚洲色无码专线精品观看| 99久久无色码中文字幕| 亚洲va精品中文字幕| 在线观看热码亚洲av每日更新| 婷婷久久综合九色综合88| 九九这里只有精品视频| 91在线一9|永久视频在线| 亚洲三级成人| 国产精品福利在线观看无码卡| 激情综合网址| a级毛片网| 91原创视频在线| 最新午夜男女福利片视频| 日本免费福利视频| 国产精品自在拍首页视频8| 亚洲国产日韩在线观看| 成人精品午夜福利在线播放| 久久久久久久97| www.国产福利| 在线观看精品自拍视频|