经过Google搜索并没有找到我要找的内容后,我决定提出这个问题。
我正在使用绑定变量,正如Mark A. Williams在 2005 标题为The Values That Bind这篇精彩文章中所证明的那样:
OracleParameter p_APP_NAME =
new OracleParameter("p_APP_NAME", OracleDbType.NVarchar2, ParameterDirection.Input);
p_APP_NAME.Size = 50;
p_APP_NAME.Value = log.Application.Name;
cmd.Parameters.Add(p_APP_NAME);
我成功启用了ODP.NET
debug tracing,但缺少的一个关键信息是记录的SQL statement
没有显示绑定变量绑定的值是什么。
它正在记录OracleCommand.CommandText
但没有OracleCommand.Parameters
值。它告诉我这个:
TIME:2013/09/20-22:59:21:890 TID:20fc OpsSqlPrepare2(): SQL: UPDATE PS_LOG SET
APP_NAME = :p_APP_NAME,
WHERE LOG_ID = :p_LOG_ID
我真正希望看到的是发送到ORACLE服务器的查询中使用的实际值,如下所示:
TIME:2013/09/20-22:59:21:890 TID:20fc OpsSqlPrepare2(): SQL: UPDATE PS_LOG SET
APP_NAME = 'App Name',
WHERE LOG_ID = 777
使用ODP.NET
跟踪功能时,我是否遗漏了一些配置或我想要的信息?
如果这不是内置的,我想我必须实现自己的替换方法并自己记录SQL Statement
。
答案 0 :(得分:7)
作为其中一个选项,您可以通过为会话设置级别12或4的10046事件来手动或自动打开带有绑定变量转储的sql跟踪(例如,在用户的登录触发器中):
alter session set events '10046 trace name context forever, level 12';
之后,将在user_dump_dest
参数指定的目录中生成跟踪文件。
SQL> show parameter user_dump_dest;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
user_dump_dest string D:\...\diag\rdbms\cdb\cdb
\trace
以下是一个例子:
SQL> alter session set events '10046 trace name context forever, level 12';
2 variable var number;
3 exec :var := 1234567; -- our bind variable
4 select 1 from dual where 1234567 = :var ;
在新生成的跟踪文件中提供的其他信息中,我们可以找到有关查询,绑定变量及其值/的值的信息:
参与游标#375980232 len = 40 dep = 0 uid = 103
oct = 3 lid = 103 tim = 2640550035 hv = 1641534478
ad ='7ff5bd0baf0'sqlid ='ap9rzz5hxgp0f'
从双重中选择1,其中1234567 =:var < - 我们的查询
STMT结束 PARSE#375980232:c = 0,e = 375,p = 0,cr = 0,cu = 0,mis = 1,r = 0,dep = 0,og = 1,plh = 0,tim = 2640550034 > BINDS#375980232:
绑定#0
oacdty = 02 mxl = 22(22)mxlc = 00 mal = 00 scl = 00 pre = 00
oacflg = 03 fl2 = 1000000 frm = 01 csi = 178 siz = 24 off = 0
kxsbbbfp = 16646e10 bln = 22 avl = 05 flg = 05
value = 1234567 < - 绑定变量的值
您也可以从Oracle 10g开始,查询v$sql_bind_capture
动态性能视图以获取有关绑定变量及其值的信息:
select t.parsing_user_id
, t.sql_fulltext -- text of a query
, bc.name -- name of a bind variable
, bc.value_string -- value of a bind variable
from v$sqlarea t
join v$sql_bind_capture bc
on (bc.sql_id = t.sql_id)
join v$session s
on (s.user# = t.parsing_schema_id)
where s.username = user
and bc.name in (':VAR') -- name of a bind variable(s),
-- value(s) of which we want to know
结果:
PARSING_USER_ID SQL_FULLTEXT NAME VALUE_STRING
------------------------------------------------------------------------
103 select 1 from dual where 1 =:var :VAR 1234567
答案 1 :(得分:2)
我同意Nicholas发布的所有内容,但会补充说,从Oracle 10.1开始,DBMS_MONITOR PL/SQL Package是启用/禁用跟踪的首选方法。虽然设置这个活动仍然有效,但尼古拉斯已经很好地证明了这一点。
正如您所观察到的那样,ODP不会将绑定变量值作为安全考虑因素发布到其跟踪文件中。