当前位置: 代码迷 >> SQL >> PL/SQL_触发器五(建立系统事件触发器)
  详细解决方案

PL/SQL_触发器五(建立系统事件触发器)

热度:55   发布时间:2016-05-05 11:36:53.0
PL/SQL_触发器5(建立系统事件触发器)
系统事件触发器是指基于Oracle系统事件(例如LOGON和STARTUP)所建立的触发器。通过使用系统事件触发器,提供了跟踪系统或数据库变化的机制。
1、常用事件属性函数
1)ora_client_ip_address:用于返回客户端的IP地址
2)ora_database_name:用于返回当前数据库名
3)ora_des_encrypted_password:用于返回DES加密后的用户口令
4)ora_dict_obj_name:用于返回DDL操作所对应的数据库对象名
5)ora_dict_obj_name_list(name_list OUT ora_name_list_t):用于返回在事件中被修改的对象名列表
6)ora_dict_obj_owner:用于返回DDL操作所对应的对象的所有者名
7)ora_dict_obj_owner_list(owner_list OUT ora_name_list_t):用于返回在事件中被修改对象的所有者列表
8)ora_dict_obj_type:用于返回DDL操作所对应的数据库对象的类型
9)ora_grantee(user_list OUT ora-name_list_t):用于返回授权事件的授权者
10)ora_instance_num:用于返回例程号
11)ora_is_alter_column(column_name IN VARCHAR2):用于检测特定列是否被修改
12)ora_is_creating_nested_table:用于检测是否正在建立嵌套表
13)ora_is_drop_column(column_name IN VARCHAR2):用于检测特定列是否被删除
14)ora_is_servererror(error_number):用于检测是否返回了特定Oracle错误
15)ora_login_user:用于返回登录用户名
16)ora_sysevent:用于返回触发触发器的系统事件名

2、建立例程启动和关闭触发器
首先建立事件表tbl_event,示例如下:
CREATE TABLE tbl_event(  event VARCHAR2(20),  etime DATE);
在建立了事件表event_table之后,就可以在触发器中引用该表了。注意,例程启动触发器和例程关闭触发器只有特权用户才能建立,并且例程启动触发器只能使用AFTER关键字,而例程关闭触发器只能使用BEFORE关键字。
CREATE OR REPLACE TRIGGER tr_startupAFTER STARTUP ON DATABASEBEGIN  INSERT INTO tbl_event(event,etime)  VALUES (ora_sysevent,SYSDATE);END;/CREATE OR REPLACE TRIGGER tr_shutdownBEFORE SHUTDOWN ON DATABASEBEGIN  INSERT INTO tbl_event(event,etime)  VALUES (ora_sysevent,SYSDATE);END;
3、建立登录和退出触发器
首先建立专门存放登录和退出的信息表tbl_log。
CREATE TABLE tbl_log(  username VARCHAR2(20),  logon_time DATE,  logoff_time DATE,  address VARCHAR2(20));
在建立了TBL_LOG表之后,就可以在触发器中引用该表了。注意,登录触发器和退出触发器一定要以特权用户身份建立,并且登录触发器只能使用AFTER关键字,而退出触发器只能使用BEFORE关键字。
CREATE OR REPLACE TRIGGER tr_logonAFTER LOGON ON DATABASEBEGIN  INSERT INTO tbl_log(username,logon_time,address)  VALUES (ora_login_user,SYSDATE,ora_client_ip_address);END;/CREATE OR REPLACE TRIGGER tr_logoffBEFORE LOGOFF ON DATABASEBEGIN  INSERT INTO tbl_log(username,logoff_time,address)  VALUES (ora_login_user,SYSDATE,ora_client_ip_address);END;
测试:
SQL> conn [email protected];SQL> conn [email protected];SQL> conn [email protected] AS SYSDBA;SQL> SELECT * FROM tbl_log;
4、建立DDL触发器
为了记载DDL事件信息,应该建立专门的表,以便存放DDL事件信息。
CREATE TABLE tbl_eventddl(  event VARCHAR2(20),  username VARCHAR2(10),  owner VARCHAR2(10),  objname VARCHAR2(20),  objtype VARCHAR2(10),  etime DATE);
在建立了表tbl_eventddl之后,就可以在触发器中引用该表了。为了记载DDL事件,应该建立DDL触发器。注意,当建立DDL触发器时,必须要使用AFTER关键字。
CREATE OR REPLACE TRIGGER tr_ddlAFTER DDL ON SCOTT.schemaBEGIN  INSERT INTO tbl_eventddl(event,username,owner,objname,objtype,etime)  VALUES (ora_sysevent,ora_login_user,ora_dict_obj_owner,ora_dict_obj_name,ora_dict_obj_type,SYSDATE);END;
测试:
CREATE TABLE tbl_temp(  ID INTEGER PRIMARY KEY,  NAME VARCHAR2(20));DROP TABLE tbl_temp;SELECT * FROM tbl_eventddl;

管理触发器

1、显示触发器信息
SELECT trigger_name,status FROM user_triggersWHERE table_name='EMP';
2、禁止触发器
SQL> ALTER TRIGGER tr_check_sal DISABLE;
3、激活触发器
SQL> ALTER TRIGGER tr_check_sal ENABLE;
4、禁止或激活表的所有触发器
SQL> ALTER TABLE emp DISABLE ALL TRIGGERS;SQL> ALTER TABLE emp ENABLE ALL TRIGGERS;
5、重新编译触发器
SQL> ALTER TRIGGER tr_check_sal COMPILE;
6、删除触发器
SQL> DROP TRIGGER tr_check_sal;
  相关解决方案