Oracle觸發器6(建立系統事件觸發器)

路途中的人2012發表於2017-01-15

Oracle觸發器6(建立系統事件觸發器)

(2012-02-14 09:23:36)
標籤:

觸發器

建立

用於

事件

例程

分類: 工作

前提要:系統時間觸發器是指基於Oracle系統事件(LOGIN登入  STARTUP啟動)所建立的觸發器,通過使用系統事件觸發器,提供了跟蹤系統或資料庫變化的機制。

 

1.常用事件屬性函式

建立系統觸發器要用到的:

  • ora_client_ip_address:用於返回客戶端的IP地址
  • ora_database_name:用於返回當前資料庫名
  • ora_des_encrypted_password:用於返回DES加密後的使用者口令
  • ora_dict_obj_name:用於返回DDL操作所對應的資料庫物件名
  • ora_dict_obj_name_list(name_list_ OUT ora_name_list_t):用於返回字事件中被修改的物件名列表
  • ora_dict_obj_owner:用於返回DDL操作所對應的物件的所有者名。
  • ora_dict_obj_ower_list(ower_list OUT ora_name_list_t):用於返回在事件中被修改物件的所有者列表
  • ora_dict_obj_type:用於返回DDL操作所對應的資料庫物件的型別。
  • ora_grantee(user_list OUT ora_name_list_t):用於返回授權時事件授權者。
  • ora_instance_num:用於返回歷程號。
  • ora_is_alter_column(column_name IN VARCHAR2):用於檢測特定列是否被修改
  • ora_is_creating_nested_table:用於檢測是否正在建立巢狀表
  • ora_is_drop_column(column_name IN VARCHAR2):用於檢測特定列是否被刪除
  • ora_is_servererror(error_number):用於檢測是否返回了特定Oracle錯誤。
  • ora_login_user:用於返回登入使用者名稱
  • ora_sysevent :用於返回觸發 觸發器的系統時間名。

 

 

2.建立例程啟動和關閉觸發器:

為了跟蹤例程啟動和關閉事件,可以分別建立例程啟動觸發器和歷程關閉觸發器

為了記載歷程啟動和或關閉事件和時間,首先建立事件表event_table:

 

 

conn sys/oracle as sysdba

create table event_table(event varchar2(30),time date);

 

在建立了事件表event_table之後,就可以在觸發器中引用該表了。

例程啟動觸發器和關閉觸發器只有特權使用者才能建立例程啟動觸發器只能使用AFTER關鍵字,而例程關閉觸發器只能使用BEFORE關鍵字

CREATE OR REPPLACE TRIGGER tr_startup

AFTER STARTUP ON DATABASE

BEGIN

INSERT INTO event_table VALUES(ora_sysevent,SYSDATE);

END;

/

 

CREATE OR REPLACE TRIGGER tr_shutdown

BEFORE SHUTDOWN ON DATABASE

BEGIN

INSERT INTO event_table VALUES(ora_sysevent,SYSDATE);

END;

/

 

在建立了tr_startup觸發器之後,當開啟資料庫之後會執行該觸發器相應程式碼,在建立觸發器tr_shutdown之後,在關閉例程之前,會執行觸發器的相應程式碼,但SHUTDOWN ABORT(關閉資料庫)不會觸發該觸發器。

 

 

 

3.建立登入和退出觸發器

為了記載使用者登入和退出事件,可以分別建立登入和退出觸發器。為了記載登入使用者和退出使用者的名稱。時間和IP地址,應該首先建立專門存檔登入和退出的資訊表LOG_TABLE

 

conn sys/oracle as sysdba

CREATE TABLE log_table(

username VARCHAR2(20),login_time DATE,

logoff_time DATE,address VARCHAR2(20)

);

 

在建立了LOG_TABLE表之後,就可以在觸發器中引用該表了。

要用特權身份使用者來建立登入和退出觸發器,並且登入觸發器只能使用AFTER關鍵字,而退出觸發器用BEFORE

 

CREATE OR REPLACE TRIGGER tr_logon

AFTER LOGON ON DATABASE

BEGIN

INSERT INTO log_table(username,logon_time,address)

VALUES(ora_login_user,SYSDATE,ora_client_ip_address);

END;

/

 

CREATE OR REPLACE TRIGGER tr_logoff

BEFORE LOGOFF ON DATABASE

BEGIN

INSERT INTO log_table(username,logoff_time,address)

VALUES(ora_login_user,SYSTEM,ora_client_ip_address);

END;

/

在建立了觸發器tr_logon之後,當使用者登入到資料庫之後,會執行其觸發器程式碼;在建立了觸發器tr__logoff之後,當使用者斷開資料庫連線之前,會執行其觸發器程式碼。

 

4.建立DDL觸發器

 

為了記載系統所發生的DDL事件(CREATE,ALTER,DROP),可以建立DDL觸發器,為了記載DDL時間資訊,應該建立專門的表,以便存放DDL事件資訊。

conn sys/oracle as sysdba

CREATE TABLE event_ddl(

event VARCHAR2(20),username VARCHAR2(10),

owner VARCHAR2(10),obbjname VARCHAR2(20),

objtype VARCHAR2(10),time DATE

);

 

在建立了表event_ddl之後,就可以在觸發器中引用該表,為了記載DDL事件,應該建立DDL觸發器,注意,當建立DDL觸發器時,必須使用AFTER關鍵字。

 

CREATE OR REPLACE TRIGGER tr_ddl

AFTER DDL ON scott.schema

BEGIN

INSERT INTO event_ddl VALUES(

ora_sysevent,ora_login_user,ora_dict_obj_owner,ora_dict_obj_name,ora_dict_obj_type,SYSDATE

);

END;

/

 

當建立了觸發器tr_dll之後,如果在SCOTT方案物件上執行了DDL操作,則會將該新息記載到表event_ddl中。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27042095/viewspace-741198/,如需轉載,請註明出處,否則將追究法律責任。

相關文章