如何在Oracle中核查数据库对象及触发器的修改者
Oracle数据库对象及触发器修改者核查方案
1. 核查Oracle中修改数据库对象的人员
基础数据字典查询(仅获取修改时间)
通过DBA_OBJECTS视图可查看对象的最后修改时间,但默认不记录修改者:SELECT owner, object_name, object_type, last_ddl_time FROM dba_objects WHERE object_name = 'YOUR_OBJECT_NAME' AND object_type = 'YOUR_OBJECT_TYPE'; -- 替换为TABLE、VIEW、TRIGGER等类型启用数据库审计(核心解决方案)
要获取修改者信息,必须开启数据库审计(需SYSDBA权限):- 开启审计并重启数据库:
ALTER SYSTEM SET audit_trail=DB,EXTENDED SCOPE=SPFILE; SHUTDOWN IMMEDIATE; STARTUP; - 配置审计规则,可选择全局DDL审计或特定对象审计:
-- 审计所有用户的DDL操作 AUDIT ALL DDL BY ALL; -- 或仅审计指定对象的修改操作 AUDIT ALTER, DROP, CREATE ON your_schema.your_object BY ACCESS; - 查询审计日志获取修改者详情:
SELECT username, obj_name, obj_type, action_name, timestamp, host, terminal FROM dba_audit_trail WHERE obj_name = 'YOUR_OBJECT_NAME' AND action_name IN ('ALTER', 'CREATE', 'DROP');
若使用Oracle 12c及以上版本,推荐使用统一审计视图:
SELECT username, object_name, object_type, action_name, event_timestamp, client_hostname, client_ip_address FROM unified_audit_trail WHERE object_name = 'YOUR_OBJECT_NAME' AND action_name IN ('ALTER', 'CREATE', 'DROP');- 开启审计并重启数据库:
2. 核查特定触发器的修改者(多机共用凭证场景)
当多台机器使用相同用户凭证连接时,需结合客户端标识信息定位操作来源:
利用审计日志的客户端字段
开启审计后,日志会记录客户端主机名、IP地址等信息,可通过这些字段区分操作机器:SELECT username, object_name, action_name, event_timestamp, client_hostname, client_ip_address FROM unified_audit_trail WHERE object_name = 'YOUR_TRIGGER_NAME' AND object_type = 'TRIGGER' AND action_name IN ('ALTER', 'CREATE', 'DROP');自定义日志表补充追踪
若审计信息不足,可创建自定义日志表和DDL触发器捕获详细操作:- 创建日志存储表:
CREATE TABLE trigger_mod_log ( log_id NUMBER GENERATED ALWAYS AS IDENTITY, trigger_name VARCHAR2(128), modified_by VARCHAR2(128), modify_time TIMESTAMP, client_host VARCHAR2(128), client_ip VARCHAR2(40), action_type VARCHAR2(30) ); - 创建DDL触发器捕获触发器修改事件:
CREATE OR REPLACE TRIGGER track_trigger_changes AFTER CREATE OR ALTER OR DROP ON DATABASE WHEN (ora_dict_obj_type = 'TRIGGER' AND ora_dict_obj_name = 'YOUR_TRIGGER_NAME') DECLARE v_ip VARCHAR2(40); BEGIN SELECT SYS_CONTEXT('USERENV', 'IP_ADDRESS') INTO v_ip FROM DUAL; INSERT INTO trigger_mod_log ( trigger_name, modified_by, modify_time, client_host, client_ip, action_type ) VALUES ( ora_dict_obj_name, USER, SYSTIMESTAMP, SYS_CONTEXT('USERENV', 'HOST'), v_ip, ora_sysevent ); END; / - 查询自定义日志:
SELECT * FROM trigger_mod_log ORDER BY modify_time DESC;
- 创建日志存储表:
内容的提问来源于stack exchange,提问作者Sha
相关产品推荐
相关产品推荐

