您好,登錄后才能下訂單哦!
本篇內容介紹了“Oracle中怎么建立系統事件觸發器”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
<SCRIPT. $tag="觸發器,建立,用于,事件,例程" $tag_code="64e2a8d9ae7359def02feebdbe14d783" $r_quote_bligid="71806002010108pu" $worldcup="0" var $worldcupball="0" ; < SCRIPT. 標簽: 觸發器建立用于事件例程 | 分類: 工作 |
前提要:系統時間觸發器是指基于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中。
“Oracle中怎么建立系統事件觸發器”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。