【问题标题】:Quick method to catch/capture Stored Procedure calls (with parameters) in Oracle?在 Oracle 中捕获/捕获存储过程调用(带参数)的快速方法?
【发布时间】:2014-04-01 15:39:37
【问题描述】:

我需要捕获 Oracle 存储过程调用(带参数)以跟踪应用程序(使用 JDBC 连接到数据库)。对于 MS SQL SERVER 中的 Rpc:Completed 事件,我需要类似 sp_trace_setevent 的东西。

我无权访问此应用程序,但几乎拥有数据库中的所有权限。我想留在 PL/SQL(和 Oracle SQL Developer 3.2.20)。

我试过了:

  1. Oracle SQL Developer UI“工具”/“实时 SQL 监控”和“工具”/“会话”工具,但无法理解如何启用累积信息而不是捕获瞬间快照。

    李>
  2. 正在探索 v$sql - 似乎没有 sp 调用。

  3. v$sqlarea 差异(Oracle: is there a tool to trace queries, like Profiler for sql server?,mdj3884 回复)-在那里我可以找到我的测试调用,但没有参数...

  4. 来自 Tom 文章的建议:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:767025833873。特别是,它循环通过v$sqltext_with_newlines,但我不明白什么是脚本结果。更像是瞬间快照;不是吗?但是为什么他们称之为跟踪呢?

  5. 使用DBMS_APPLICATION_INFO - 据我了解,我可以将自定义信息添加到V$SESSIONV$SESSION_LONGOPS - 它对于监控任务很有用,但我无法想象它如何用于累积有关 sp 调用及其参数的信息。

  6. 使用DBMS_MONITOR 启用跟踪文件。但我找不到启用仅跟踪 sp 调用事件的选项,它还需要访问服务器文件。

  7. DBMS_PROFILER - 收集据我所知,默认情况下它只收集统计信息(最小、最大时间);应该可以向plsql_profiler_runs 添加自定义信息,但我找不到这个表(当DBMS_PROFILER 到位时)。

接下来要看什么?我错过了什么?

附:如果唯一的方法是更改​​ SP 主体(需要跟踪的那些 SP),那么在 Oracle 中从 sp 主体记录 sp 参数的最快和最安全的方法是什么?它可以记录到自定义表,但我可以选择生成其他类型的事件(不回滚,例如 SQL Server 自定义跟踪事件)?

【问题讨论】:

  • 我不确定,但 DBMS_AUDIT_MGMT 可能允许您这样做。我知道它可以用来捕获表更改,所以也许它也可以捕获 PL/SQL 的东西。还有人知道吗?
  • docs.oracle.com/cd/E11882_01/network.112/e36292/…)中AUDIT_TRAIL(DBMS_AUDIT_MGMT的对象)的定义说它是DDL操作发生的报告。我也找不到有关审核 sp 调用的信息。 :( 阅读 Oracle 文档太难了,我永远无法确定 100% 的结论。

标签: oracle oracle11g oracle-sqldeveloper profiler trace


【解决方案1】:

添加一些自定义功能来执行此操作很容易(请参阅下面的大部分所需功能),或者您可以使用 sqltrace 或企业管理器报告并搜索它们:

create package p_audit as 
 type t_param_type is table of varchar2(50) index by binary_integer;

 procedure p_audit (p_procedure varchar2, l_param_type t_param_type);
end;

create table audit_table (procedure_name varchar2(50), parameters varchar2(500))

create or replace package body p_audit is

procedure p_audit (p_procedure varchar2, l_param_type t_param_type) is
  pragma autonomous_transaction;  
begin
  insert into audit_table values (p_procedure,l_param_type(1));
  commit;
end;

end p_audit;

declare
  l_param_type p_audit.t_param_type;
begin
  l_param_type(1):='parameter 1';
  p_audit.p_audit('test procedure',l_param_type);
end;

【讨论】:

  • 这是一个好主意——基于 varchar2 进行泛化... 有一天我会使用它。现在我已经制作了没有类型泛化的 p_audit 和 audit_table 过程生成器。
【解决方案2】:

我使用 DBMS_AUDIT 跟踪来确定客户端应用程序执行时使用的过程/函数/包类型。我真的建议您使用它一次,它确实有帮助,但问题是您无法在包层次结构中更深入地分析它的函数/过程称为(调用),而只能分析它的用法。如果你想知道包的依赖,你可以使用 ALL_DEPENDENCIES。这可能会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 2010-12-09
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多