DML触发器和替代触发器都是在DML事件上触发的 ,而系统触发器是在DDL事件和数据库服务器事件时触发的。
定义系统触发器
语法如下:
CREATE [OR REPLACE] TRIGGER trigger_name
{
BEFORE | AFTER} {DDL event |DATABASE event}
ON {
DATABASE | SCHEMA}
[WHEN [...]]
plsql_block
DDL event包括ALTER、ANALYZE、ASSOCIATE STATISTICS、AUDIT、COMMENT、CREATE、DROP、GRANT、RENAME、REVOKE、TRUNCATE等。
DATABASE event是数据库级的系统事件,对每一个触发的事件,Oracle会打开一个匿名事务,触发触发器,提交任何独立的事务,这些事件有SERVERERROR、LOGON、LOGOFF、STARTUP、SHUTDOWN、SUSPEND。
在创建数据库级的触发器时,必须具有ADMINISTER DATABASE TRIGGER的系统权限。
代码如下:
CREATE TABLE created_log
(
obj_owner VARCHAR2(30), --所有者
obj_name VARCHAR2(30), --对象名称
obj_type VARCHAR2(20), --对象类型
obj_user VARCHAR2(30), --创建用户
created_date DATE --创建日期
)
CREATE OR REPLACE TRIGGER t_created_log
AFTER CREATE ON scott.SCHEMA --在soctt方案下创建对象后触发
BEGIN
--插入日志记录
INSERT INTO scott.created_log(obj_owner, obj_name,
obj_type, obj_user, created_date
)
VALUES (SYS.dictionary_obj_owner, SYS.dictionary_obj_name,
SYS.dictionary_obj_type, SYS.login_user, SYSDATE
);
END;
触发器事件列表
DDL触发器事件列表如下:
事件 | 触发时机 | 描述 |
---|---|---|
CRAETE | BEFORE/AFTER | 在创建一个方案对象之前或之后触发,比如创建表、索引等对象 |
DROP | BEFORE/AFTER | 在删除一个方案对象之前或之后触发 |
ALTER | BEFORE/AFTER |