系统事件触发器是指基于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_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;