You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 12c统一审计能否审计包内存储过程/函数的执行?

Oracle统一审计:如何审计包内的存储过程/函数

可以实现对包内具体存储过程或函数的审计,以下是几种可行方案:

1. 结合细粒度审计(FGA)

统一审计默认只记录包级的执行,但配合**细粒度审计(FGA)**可以精准追踪包内的具体对象。直接针对包内的过程/函数创建FGA策略,审计记录会同步到UNIFIED_AUDIT_TRAIL,同时也能在DBA_FGA_AUDIT_TRAIL中查看细节。

示例创建审计策略:

BEGIN
  DBMS_FGA.ADD_POLICY(
    object_schema => '你的模式名',
    object_name   => '目标包名',
    policy_name   => 'AUDIT_PROC_IN_PACKAGE',
    audit_condition => '1=1', -- 可根据需求设置触发条件,比如特定参数值
    statement_types => 'EXECUTE'
  );
END;
/

执行后,调用包内的过程/函数时,审计记录会明确标记出具体的对象名称,在UNIFIED_AUDIT_TRAIL的OBJECT_NAME或ACTION_NAME字段中可以找到。

2. 自定义审计逻辑嵌入代码

如果需要更灵活的审计内容(比如记录传入参数、执行上下文),可以在包内的过程/函数开头添加自定义审计代码,将执行信息写入自定义审计表。

示例步骤:

  1. 创建自定义审计表:
CREATE TABLE PROC_AUDIT_LOG (
  audit_time TIMESTAMP DEFAULT SYSTIMESTAMP,
  schema_name VARCHAR2(30),
  package_name VARCHAR2(30),
  proc_name VARCHAR2(30),
  username VARCHAR2(30),
  client_ip VARCHAR2(40)
);
  1. 修改包体,插入审计记录:
CREATE OR REPLACE PACKAGE BODY 目标包名 AS
  PROCEDURE 目标过程名(param1 VARCHAR2) IS
  BEGIN
    -- 写入审计日志
    INSERT INTO PROC_AUDIT_LOG (
      schema_name, package_name, proc_name, username, client_ip
    ) VALUES (
      SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA'),
      '目标包名',
      '目标过程名',
      SYS_CONTEXT('USERENV', 'SESSION_USER'),
      SYS_CONTEXT('USERENV', 'IP_ADDRESS')
    );
    -- 原有业务逻辑
    -- ...
  END 目标过程名;
END 目标包名;
/

这种方式完全可控,适合需要额外业务上下文的审计场景。

3. 临时排查:使用SQL Trace

如果只是临时排查问题,可以启用SQL Trace追踪会话,通过生成的trace文件查看具体执行的包内对象。但这种方式性能开销大,不适合长期审计。

注意事项

  • 统一审计本身的设计是针对对象级别的操作,包作为一个整体对象,默认不会拆分内部对象的执行记录,必须通过FGA或自定义逻辑补充。
  • FGA策略创建后,需要确保用户有足够的权限执行相关操作,同时注意审计日志的存储空间管理。

内容的提问来源于stack exchange,提问作者Landon Statis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 01:14:59