Oracle中的System Triggers也就是DDL触发器,是建立在数据库或模式级别的触发器,会在执行DDL(数据定义语言)操作时自动触发执行,和普通的DML触发器不同,它针对的是表结构变更、用户创建这类操作。

DDL触发器的基本概念
DDL触发器可以监控的DDL事件包括CREATE、ALTER、DROP、GRANT、REVOKE等,根据作用范围可以分为数据库级和模式级两种。数据库级触发器监控整个数据库的所有DDL操作,模式级触发器只监控指定模式下的DDL操作。
它的触发时机分为BEFORE和AFTER两种,BEFORE触发器可以在DDL操作执行前做校验或者拦截,AFTER触发器则适合用来记录操作日志。
DDL触发器的常见作用
- 操作审计:记录所有DDL操作的执行人、执行时间、操作内容,方便后续追溯问题
- 权限管控:限制非授权用户执行特定DDL操作,避免误删表、误改结构的情况
- 自动维护:比如在创建新表时自动给表添加特定的注释或者权限
- 异常告警:当执行敏感DDL操作时发送告警,及时通知管理员
DDL触发器的创建语法
创建DDL触发器的基本语法如下,需要注意触发器的名称不能和现有对象重名:
-- 创建数据库级DDL触发器,记录所有DDL操作
CREATE OR REPLACE TRIGGER trg_ddl_audit
AFTER DDL ON DATABASE
DECLARE
v_oper_user VARCHAR2(50);
v_oper_time DATE;
v_ddl_text VARCHAR2(2000);
BEGIN
-- 获取当前操作用户
v_oper_user := SYS_CONTEXT('USERENV', 'CURRENT_USER');
-- 获取当前操作时间
v_oper_time := SYSDATE;
-- 获取DDL语句内容
v_ddl_text := ORA_DICT_OBJ_NAME || ' ' || ORA_SYSEVENT;
-- 将操作记录插入审计表,审计表需要提前创建
INSERT INTO ddl_audit_log (oper_user, oper_time, ddl_content)
VALUES (v_oper_user, v_oper_time, v_ddl_text);
COMMIT;
END;
/上面的示例中,ON DATABASE表示这是数据库级触发器,如果是模式级触发器可以替换为ON SCHEMA或者ON 模式名.SCHEMA。
使用DDL触发器的注意事项
首先,创建DDL触发器需要拥有相应的权限,比如CREATE TRIGGER系统权限,还有对应模式下的ALTER权限。
其次,不要在DDL触发器里写过于复杂的逻辑,否则会影响DDL操作的执行效率,甚至可能导致DDL操作失败。
另外,如果需要禁用或者删除DDL触发器,可以使用以下语句:
-- 禁用触发器 ALTER TRIGGER trg_ddl_audit DISABLE; -- 启用触发器 ALTER TRIGGER trg_ddl_audit ENABLE; -- 删除触发器 DROP TRIGGER trg_ddl_audit;
最后,DDL触发器的审计记录表需要提前规划好存储策略,避免长期运行后占用过多表空间。
OracleDDL触发器System_Triggers数据库审计数据库管理修改时间:2026-06-06 22:53:04