PL/SQL_触发器5(建立系统事件触发器)
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_startup AFTER STARTUP ON DATABASE BEGIN INSERT INTO tbl_event(event,etime) VALUES (ora_sysevent,SYSDATE); END; / CREATE OR REPLACE TRIGGER tr_shutdown BEFORE SHUTDOWN ON DATABASE BEGIN 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_logon AFTER LOGON ON DATABASE BEGIN INSERT INTO tbl_log(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 tbl_log(username,logoff_time,address) VALUES (ora_login_user,SYSDATE,ora_client_ip_address); END;测试:
SQL> conn scott/tiger@orcl; SQL> conn SYSTEM/manager@orcl; SQL> conn SYS/oracle@orcl 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_ddl AFTER DDL ON SCOTT.schema BEGIN 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_triggers WHERE 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;
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。