试图知道哪些表在oracle外部应用程序中执行

时间:2019-01-07 13:46:39

标签: sql oracle oracle11g oracle-apps

我想知道这是否可能。

我正在使用TOAD,已连接到Oracle数据库(11g),并且可以访问Oracle E-BUSINESS-SUITE应用程序。

基本上,我希望Toad跟踪Oracle E-BUSINESS-SUITE应用程序正在执行的sql

我有这个查询:

SELECT nvl(ses.username,'ORACLE PROC')||' ('||ses.sid||')' USERNAME,
       SID,   
       MACHINE, 
       REPLACE(SQL.SQL_TEXT,CHR(10),'') STMT, 
      ltrim(to_char(floor(SES.LAST_CALL_ET/3600), '09')) || ':'
       || ltrim(to_char(floor(mod(SES.LAST_CALL_ET, 3600)/60), '09')) || ':'
       || ltrim(to_char(mod(SES.LAST_CALL_ET, 60), '09'))    RUNT 
  FROM V$SESSION SES,   
       V$SQLtext_with_newlines SQL 
 where SES.STATUS = 'ACTIVE'
   and SES.USERNAME is not null
   and SES.SQL_ADDRESS    = SQL.ADDRESS 
   and SES.SQL_HASH_VALUE = SQL.HASH_VALUE 
   and Ses.AUDSID <> userenv('SESSIONID') 
 order by runt desc, 1,sql.piece

oracle应用程序如下所示:

ju

yu

我要这样做是因为我想知道oracle应用程序正在使用哪个来获取特定客户的联系信息。我的意思是,当一个随机的人正在使用该应用程序时,他输入account_number并单击“开始”。那就是我需要的!,我想知道当该人按下“执行”按钮时要执行哪些表,我想对其进行跟踪。

我认为我可以从使用oracle应用程序的人那里获取session_id,然后将其粘贴到上面编写的查询中,然后开始进行处理。

类似这样的东西:

kiu

如果可能,我如何从使用oracle E-BUSINESS-SUITE应用程序的人那里获取session_id?

3 个答案:

答案 0 :(得分:2)

要跟踪正在运行的软件应用程序的查询可能需要一段时间。因此,以其他方式挖掘数据可能会更容易:

您想知道哪个表和列包含一些数据,例如用户名。

生成唯一的东西,例如GUID或数据库中永远不会出现的一些不可能的名称(例如'a87d5iw78456w865wd87s7dtjdi'),然后使用UI将其输入为名字。保存数据

针对oracle运行此查询:

SELECT 
  REPLACE(REPLACE(
    'UNION ALL SELECT ''{t}'', ''{c}'' FROM {t} WHERE {c} = ''a87d5iw78456w865wd87s7dtjdi'' ',
    '{t}', table_name),
    '{c}', column_name
  )  
FROM USER_TAB_COLUMNS WHERE data_type like '%char%'

这是“编写SQL的sql”-它会生成一个结果集,该结果集基本上是这样的sql语句列表:

UNION ALL SELECT 'tablename', 'columnname' FROM tablename WHERE columnname = 'a87d5iw78456w865wd87s7dtjdi'
UNION ALL SELECT 'table2name', 'column2name' FROM table2name WHERE column2name = 'a87d5iw78456w865wd87s7dtjdi'
UNION ALL SELECT 'table3name', 'column3name' FROM table3name WHERE column3name = 'a87d5iw78456w865wd87s7dtjdi'

数据库中每个表中的每一列都会有一个查询。只能搜索CHARacter列

删除第一个UNION ALL

运行它并等待很长一段时间,而oracle基本上会在数据库中的每个表中搜索您的怪异名称。

最终它产生如下输出:

TABLE_NAME        COLUMN_NAME
crm_contacts_info first_name

因此,您知道您的名字a87d5iw78456w865wd87s7dtjdi是通过UI保存在crm_contacts_info.first_name

中的

答案 1 :(得分:2)

  

如果可能的话,我怎么能从那个家伙那里获得session_id   使用Oracle E-BUSINESS-SUITE应用程序?

是的,这绝对是可能的。首先,您需要确定“该家伙”正在使用哪个架构/用户名。如果您不知道,您可以问这个人或让他运行一些简单的查询(类似select user from dual;的查询)以获取该信息。

一旦有了模式名称,就可以查询V$SESSION表以找出会话ID。让该家伙登录,然后查询V$SESSION表。您的查询将如下所示:select * from v$session where username ='[SCHEMA]';,其中[SCHEMA]是此人用于登录的架构名称。这将为您提供SID,序列号,状态等。您将需要此信息跟踪该人的会话。

为会话生成跟踪文件相对简单。您可以开始跟踪整个数据库,也可以仅跟踪一个会话。由于您只对男生的会话感兴趣,因此只需跟踪该会话即可。要开始跟踪,您可以使用如下命令:EXEC DBMS_MONITOR.session_trace_enable(session_id=>[SESSIONID], serial_num=>[SERIAL#]);,其中[SESSIONID][SERIAL#]是您从上一步获得的数字。 请记住,该家伙需要登录后才能进行会话跟踪,以获取任何结果

一旦该人员登录并启用了会话跟踪,请让该人员运行您感兴趣的电子商务套件中的任何命令。请注意,该人员(或应用程序)在执行跟踪已启用,您将需要获取更多信息以查找所需内容。这可能是应用程序中的大量数据。只是提前警告您。

此人完成任务后,需要禁用跟踪。可以像以前一样使用DBMS_MONITOR包来完成此操作,只是稍有不同。该命令如下所示:EXEC DBMS_MONITOR.session_trace_disable(session_id=>[SESSIONID], serial_num=>[SERIAL#]);使用与以前相同的[SESSIONID][SERIAL#]

假设一切均已正确完成,这将生成跟踪文件。 @thatjeffsmith提到服务器访问的原因是,您将需要访问数据库所驻留的任何服务器以获取跟踪文件。如果您无权访问服务器,则需要与DBA或具有访问权的人员合作才能获取服务器。如果您仅需要帮助找出跟踪文件的位置,则可以使用之前的[SESSIONID]来运行以下查询:

SELECT p.tracefile
FROM   v$session s
       JOIN v$process p ON s.paddr = p.addr
WHERE  s.sid = [SESSIONID];

这应该返回一个类似于以下内容的目录:/u01/app/oracle/diag/rdbms/[database]/[instance]/trace/[instance]_ora_010719.trc

只需导航到该目录,使用WinSCP,FileZilla或您选择的应用程序提取跟踪文件,然后即可完成。

祝您好运,希望对您有所帮助!

答案 2 :(得分:0)

从EBS前端执行的SQL通常太快而无法在v $ session中看到。如果某个SQL的速度慢于一秒(如果快照时间合适,则该时间),您会在v $ active_session_history中看到它,该快照每秒捕获所有活动会话的快照。

您应该查看的地方是v $ sqlarea,可以通过SQL,通过Toad使用Database-> Monitor-> SGA Trace / Optimization菜单选项或通过Blitz Report https://www.enginatics.com/reports/dba-sga-sql-performance-summary/来完成。 / p>

但是,此数据仅具有有关模块的信息(即,哪个OAF页,表单,并发等)和责任(操作列)级别,并且不包含会话或应用程序用户信息。

唯一键是sql_id和plan_hash_value,这意味着对于由不同模块执行且职责不同的SQL,仅显示首先执行它的模块。

如果您按last_active_time对数据进行排序并为所涉及的模块进行过滤,则其效果几乎与跟踪一样好。可以从v $ sql_bind_capture中检索使用的绑定值,在Blitz Report上面也可以这样做。