系统事件触发器¶
系统事件触发器是指基于神通数据库系统事件所建立的触发器。通过这种触发器可以跟踪系统或数据库的变化,或者获得当前数据库的一些系统属性。
注解
ORA_NAME_LIST_T是一个类型(CREATE OR REPLACE TYPE ORA_NAME_LIST_T IS TABLE OF VARCHAR2(64);) 神通数据库支持系统事件触发器类型:create, drop, alter, grant, revoke。
下表为神通支持的系统属性函数介绍:
| 系统属性函数 | 返回值及其函数说明 |
|---|---|
| ORA_SYSEVENT | VARCHAR:返回触发DDL触发器的DDL语句的事件类型。 |
| ora_login_user | VARCHAR:返回当前登录的用户名。 |
| ora_instance_num | INT:返回当前数据库的实例号。 |
| ora_dict_obj_type | VARCHAR:返回触发DDL触发器的DDL语句所操作的对象类型。 |
| ora_dict_obj_owner() | VARCHAR:返回触发DDL触发器的DDL语句所操作的对象的拥有者。 |
| ora_database_name() | VARCHAR:返回当前数据库的名称。 |
| ora_with_grant_option() | BOOL:返回grant语句是否带有 with grant option。 |
| ora_dict_obj_name() | VARCHAR:返回DDL语句触发DDL触发器时,DDL语句所操作的对象名。 |
| ora_grantee(userlist out ORA_NAME_LIST_T) | INT:在grant授权语句中被授权USER的数量。输出参数:grant语句中被赋权的用户名 |
| ora_privilege_list(userlist out ORA_NAME_LIST_T) |
|
示例¶
示例1: create类型触发器
-- 清理环境
DROP TRIGGER tr_create;
DROP TABLE tbl_create;
DROP TABLE t1;
-- 创建表
create table tbl_create(
sysevent varchar2(20),
loginuser varchar2(20),
datanum number,
objtype varchar2(20),
objname varchar2(20),
objowner varchar2(20),
seq SERIAL
);
-- 创建触发器
CREATE OR REPLACE TRIGGER tr_create
before create on database
BEGIN
insert into tbl_create(sysevent,loginuser,datanum,objtype,objname,objowner)
values(ora_sysevent,ora_login_user,ora_instance_num,ora_dict_obj_type,ora_dict_obj_name,ora_dict_obj_owner);
END;
/
-- 创建表并触发触发器
create table t1(a int);
drop table t1;
-- 查询 tbl_create
select * from tbl_create;
SYSEVENT(varchar) |LOGINUSER(varchar) |DATANUM(numeric) |OBJTYPE(varchar) |OBJNAME(varchar) |OBJOWNER(varchar) |SEQ(int) |
------------------------------------------------------------------------------------------------------------------------------------------------------
CREATE |SYSDBA |1 |TABLE |T1 |SYSDBA |1 |
总数目:1
-- 删除触发器和表
drop trigger tr_create;
drop table tbl_create;
示例2: grant类型触发器
-- 清理环境
DROP TRIGGER trg2;
DROP USER USER1;
DROP USER USER2;
-- 创建触发器
CREATE OR REPLACE TRIGGER trg2 after grant on database
declare
user_list ora_name_list_t;
BEGIN
DBMS_OUTPUT.PUT_LINE((ora_grantee(user_list)));
DBMS_OUTPUT.PUT_LINE(user_list(1));
DBMS_OUTPUT.PUT_LINE(user_list(2));
END;
/
-- 创建用户
create user user1;
create user user2;
-- 给用户赋权
grant create table to user1,user2;
2
USER1
USER2
-- 删除用户和触发器
drop trigger trg2;
drop user user1;
drop user user2;
示例3: revoke类型触发器
-- 清理环境
DROP TRIGGER trg2;
DROP USER USER1;
-- 创建触发器
CREATE OR REPLACE TRIGGER trg2 after revoke on database
declare
privilege_list ora_name_list_t;
BEGIN
DBMS_OUTPUT.PUT_LINE((ora_privilege_list(privilege_list)));
DBMS_OUTPUT.PUT_LINE(privilege_list(1));
DBMS_OUTPUT.PUT_LINE(privilege_list(2));
END;
/
-- 创建用户
create user user1;
-- 给用户赋权并回收
grant create table,create tablespace to user1;
revoke create table,create tablespace from user1;
2
CREATE TABLE
CREATE TABLESPACE
-- 删除用户和触发器
drop trigger trg2;
drop user user1;