Попытка узнать, какие таблицы выполняются во внешнем приложении оракула. - PullRequest
0 голосов
/ 07 января 2019

Интересно, возможно ли это или нет?

Я использую TOAD, подключенный к базе данных Oracle (11 г), и у меня есть доступ к приложению Oracle E-BUSINESS-SUITE.

В общем, я хочу, чтобы Жаба проследила, какие sql выполняются приложением E-BUSINESS-SUITE оракула

У меня есть этот запрос:

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

Приложение оракула выглядит так:

ju

yu

Я хочу сделать это, потому что я хочу знать, какие таблицы приложение оракула использует для получения контактной информации для определенного клиента. Я имею в виду, когда случайный парень использует приложение, он вводит account_number и нажимает кнопку «идти». Это то, что мне нужно! Я хочу знать, какие таблицы выполняются, когда парень нажал кнопку "Перейти", я хочу отследить это.

Я думаю, что я мог бы получить session_id от парня, который использует приложение oracle, а затем вставить его в запрос, написанный выше, и начать работать над ним.

Примерно так:

kiu

Если это возможно, как я могу получить session_id от парня, который использует приложение E-BUSINESS-SUITE оракула?

Ответы [ 3 ]

0 голосов
/ 07 января 2019

Если это возможно, как я могу получить session_id от парня, который используя приложение Oracle E-BUSINESS-SUITE?

Да, это определенно возможно. Перво-наперво, вам нужно выяснить, какую схему / имя пользователя использует "парень". Если вы не знаете, вы можете попросить парня или попросить его выполнить простой запрос (что-то вроде select user from dual; будет работать), чтобы получить эту информацию.

Получив имя схемы, вы можете запросить таблицу V$SESSION, чтобы выяснить идентификатор сеанса. Попросите парня войти в систему, а затем запросить таблицу 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#] - это числа, полученные на предыдущем шаге. Пожалуйста, имейте в виду, что парню нужно будет войти в систему для отслеживания сеанса, чтобы получить какие-либо результаты .

Как только парень войдет в систему и вы включите трассировку сеанса, пусть парень выполнит любые команды из набора E-Business, которые вас интересуют. Имейте в виду, что чем больше парень (или приложение) делает, пока Трассировка включена, тем больше информации вам придется пройти, чтобы найти то, что вы ищете. Это может быть тонна данных с приложениями. Просто предупреждаю вас заранее.

После того, как парень закончил выполнять задания, вам нужно отключить трассировку. Это можно сделать с помощью пакета DBMS_MONITOR, как и раньше, только немного по-другому. Команда будет выглядеть примерно так: EXEC DBMS_MONITOR.session_trace_disable(session_id=>[SESSIONID], serial_num=>[SERIAL#]);, используя те же [SESSIONID] и [SERIAL#], что и раньше.

Предполагая, что все сделано правильно, будет создан файл трассировки. Причина, по которой @thatjeffsmith упомянула доступ к серверу, заключается в том, что вам нужно получить доступ к любому серверу (-ам), на котором работает база данных, чтобы получить файл трассировки. Если у вас нет доступа к серверу, вам нужно будет работать с администратором базы данных или кем-то, у кого есть доступ, чтобы получить его. Если вам просто нужна помощь, чтобы выяснить, где находится файл трассировки, вы можете выполнить следующий запрос, используя [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 или приложение по вашему выбору, и это должно сделать это.

Удачи и надеюсь, что это поможет!

0 голосов
/ 07 января 2019

SQL, выполняемые из внешнего интерфейса EBS, обычно слишком быстры, чтобы их можно было увидеть в 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/.

Однако эти данные содержат информацию только об уровне модуля (то есть о том, какая страница OAF, форма, параллельная и т. Д.) И об ответственности (столбец действия), и не содержат информацию о сеансе или пользователе приложения.

Уникальный ключ - sql_id и plan_hash_value, что означает, что для SQL, выполняемых разными модулями и с разными обязанностями, будет показан только модуль, выполняющий его первым.

Если вы сортируете данные по last_active_time и фильтруете для рассматриваемого модуля, это почти так же хорошо, как трассировка. Используемые значения привязки можно получить из v $ sql_bind_capture, что также применимо к отчету Blitz.

0 голосов
/ 07 января 2019

Отслеживание запросов, выполняемых активным программным приложением, может занять некоторое время. Таким образом, было бы легче выкопать данные другим способом:

Вы хотите знать, в какой таблице и столбце содержатся некоторые данные, например, имя пользователя.

Создайте что-то уникальное, например, GUID или какое-то невозможное имя, которое никогда не встречается в вашей базе данных (например, «a87d5iw78456w865wd87s7dtjdi»), и введите его в качестве имени с помощью пользовательского интерфейса. Сохранить данные

Запустите этот запрос против оракула:

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 было сохранено пользовательским интерфейсом в crm_contacts_info.first_name

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...