系统事件触发器

系统事件触发器是指基于神通数据库系统事件所建立的触发器。通过这种触发器可以跟踪系统或数据库的变化,或者获得当前数据库的一些系统属性。

注解

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)
INT:在grant或者revoke语句中用户被赋权或者被撤销权限的类型的数量。
输出参数:在grant或者revoke语句中用户被赋权或者被撤销权限的类型。

示例

示例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;