Oracle觸發器6(建立系統事件觸發器)
前提要:系統時間觸發器是指基於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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle 觸發器 client 事件Oracle觸發器client事件
- Oracle觸發器觸發級別Oracle觸發器
- 建立MySQL觸發器MySql觸發器
- MySQL 建立觸發器MySql觸發器
- mysql建立觸發器MySql觸發器
- 建立SQL觸發器SQL觸發器
- Oracle觸發器Oracle觸發器
- 有趣的觸發器事件觸發器事件
- 根據業務寫觸發器(oracle觸發器片)觸發器Oracle
- MySQL6:觸發器MySql觸發器
- ORACLE DDL觸發器Oracle觸發器
- Oracle之觸發器Oracle觸發器
- oracle ddl 觸發器Oracle觸發器
- mvvm模式 事件觸發器[wpf]MVVM模式事件觸發器
- ORACLE觸發器詳解Oracle觸發器
- Oracle登陸觸發器Oracle觸發器
- oracle 觸發器-表同步Oracle觸發器
- Oracle 登入觸發器Oracle觸發器
- Oracle開發基礎-觸發器Oracle觸發器
- SqlServer觸發器的建立與使用SQLServer觸發器
- SqlServer-建立觸發器例項SQLServer觸發器
- oracle 觸發器實現禁止在資料庫中建立dblink ---透過觸發器實現Oracle觸發器資料庫
- oracle 批量刪除觸發器Oracle觸發器
- oracle 觸發器的例項Oracle觸發器
- Oracle 觸發器 限制DDL操作Oracle觸發器
- MySQL觸發器MySql觸發器
- mysql——觸發器MySql觸發器
- mysql 觸發器MySql觸發器
- SQL觸發器SQL觸發器
- Mysql觸發器:MySql觸發器
- 【SQL Server】-- 一觸即發之觸發器SQLServer觸發器
- 簡單建立序列和觸發器示例觸發器
- SQLite建立觸發器 CREATE TRIGGERSQLite觸發器
- Oracle 觸發器中使用遊標Oracle觸發器
- Oracle觸發器詳細介紹Oracle觸發器
- mysql繞過行觸發器,實現語句觸發器MySql觸發器
- sqlserver 列觸發器SQLServer觸發器
- 除錯觸發器除錯觸發器