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

Sql 试图知道哪些表在oracle外部应用程序中执行,sql,oracle,oracle11g,oracle-apps,Sql,Oracle,Oracle11g,Oracle Apps,我想知道这是否可能 我使用的是TOAD,连接到oracle数据库(11g),我可以访问oracle电子商务套件应用程序 基本上,我希望Toad跟踪oracle电子商务套件应用程序正在执行的sql 我有一个疑问: SELECT nvl(ses.username,'ORACLE PROC')||' ('||ses.sid||')' USERNAME, SID, MACHINE, REPLACE(SQL.SQL_TEXT,CHR(10),'') STM

我想知道这是否可能

我使用的是TOAD,连接到oracle数据库(11g),我可以访问oracle电子商务套件应用程序

基本上,我希望Toad跟踪oracle电子商务套件应用程序正在执行的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
选择nvl(ses.username,'ORACLE PROC')| |'('| | ses.sid | |')'用户名,
希德,
机器,
替换(SQL.SQL_TEXT,CHR(10),“”)STMT,
ltrim(到|char(楼层(东南部,最后一次呼叫电话,3600),'09'))||':'
||ltrim(到字符(楼层(mod(SES.LAST_CALL,3600)/60),'09')):'
||ltrim(to_char(mod(SES.LAST_CALL,60),'09'))RUNT
从V$SES开始,
V$SQLtext_与新行SQL
其中SES.STATUS='ACTIVE'
并且SES.USERNAME不为空
和SES.SQL_ADDRESS=SQL.ADDRESS
SES.SQL\u HASH\u VALUE=SQL.HASH\u VALUE
和Ses.AUDSID userenv('SESSIONID')
按runt desc排序,1,sql.piece
oracle应用程序如下所示:

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'

我之所以要这样做,是因为我想知道oracle应用程序正在使用哪些表来获取某个客户的联系信息。我的意思是,当一个随机的家伙在使用这个应用程序时,他会输入帐号并点击“go”。这就是我需要的!,我想知道当那个家伙按下“go”按钮时,哪些表被执行,我想跟踪它

我想我可以从使用oracle应用程序的人那里获得会话id,然后将其粘贴到上面编写的查询中,并开始处理它

大概是这样的:

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'


如果可能,我如何从使用oracle电子商务套件应用程序的人那里获取会话id?

跟踪活动软件应用程序正在运行的查询可能需要一段时间。因此,用另一种方法挖掘数据可能更容易:

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

生成一些唯一的名称,例如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'
数据库中每个表中的每列都有一个查询。顺便说一下,只搜索字符列

删除第一个
UNION ALL

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

最终,它会产生如下输出:

TABLE_NAME        COLUMN_NAME
crm_contacts_info first_name
因此,您知道您的姓名
a87d5iw78456w865wd87s7dtjdi
由用户界面保存在crm\u联系人信息中。名字

如果可能的话,我怎样才能从那家伙那里得到会话id 使用oracle电子商务套件应用程序

是的,这是绝对可能的。首先,您需要弄清楚“那个家伙”正在使用哪个模式/用户名。如果你不知道,你可以问那个家伙或者让他运行一些简单的查询(比如
selectuserfromtoual;
会起作用)来获得这些信息

有了架构名称后,您可以查询
V$SESSION
表以确定会话id。让guy登录,然后查询
V$SESSION
表。您的查询如下所示:
select*from v$session,其中username='[SCHEMA]'
其中
[SCHEMA]
是用户登录时使用的架构名称。这将为您提供SID、序列号、状态等信息。您需要这些信息来跟踪此人的会话

为会话生成跟踪文件相对简单。可以为整个数据库启动跟踪,也可以只为一个会话启动跟踪。因为你只对那家伙的对话感兴趣,所以你只需要追踪那一次。要开始跟踪,可以使用如下命令:
EXEC DBMS\u MONITOR.session\u trace\u enable(session\u id=>[SESSIONID],serial\u num=>[serial\35;])其中
[SESSIONID]
[SERIAL#]
是您从上一步获得的数字请记住,该人员需要登录才能进行会话跟踪,以向您提供任何结果

一旦此人登录并且您启用了会话跟踪,让此人运行您感兴趣的电子商务套件中的任何命令。请注意,在启用跟踪时,guy(或应用程序)所做的工作越多,您就必须获得越多的信息才能找到您要查找的内容。应用程序中可能有大量数据。只是提前警告你

在这家伙完成任务后,你需要禁用跟踪。这可以像以前一样使用DBMS_MONITOR包来完成,只是略有不同。该命令看起来像这样:
EXEC DBMS\u MONITOR.session\u trace\u disable(session\u id=>[SESSIONID],serial\u num=>[serial\35;])使用与以前相同的
[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]\u ora\u 010719.trc

只需导航到该目录,使用WinSCP、FileZilla或您选择的应用程序拉取跟踪文件,