Попытка узнать, какие таблицы выполняются во внешнем приложении оракула
Интересно, возможно ли это или нет.
Я использую TOAD, подключенный к базе данных Oracle (11 г), и у меня есть доступ к приложению Oracle E-BUSINESS-SUITE.
В общем, я хочу, чтобы Toad проследил, какие sql выполняются приложением oracle 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
Приложение оракула выглядит так:
Я хочу сделать это, потому что я хочу знать, какие таблицы использует приложение oracle, чтобы получить контактную информацию для определенного клиента. Я имею в виду, когда случайный парень использует приложение, он вводит account_number и нажимает кнопку "идти". Это то, что мне нужно! Я хочу знать, какие таблицы выполняются, когда парень нажал кнопку "Перейти", я хочу это отследить.
Я думаю, что я мог бы получить session_id от парня, который использует приложение oracle, а затем вставить его в запрос, написанный выше, и начать работать над ним.
Что-то вроде этого:
Если это возможно, как я могу получить session_id от парня, который использует приложение E-BUSINESS-SUITE оракула?
3 ответа
Если это возможно, как я могу получить session_id от парня, который использует приложение 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 или приложение по вашему выбору, и это должно сделать это.
Удачи, и надеюсь, это поможет!
Отслеживание запросов, выполняемых активным приложением, может занять некоторое время. Таким образом, было бы легче выкопать данные другим способом:
Вы хотите знать, какая таблица и столбец содержат некоторые данные, например, имя пользователя.
Создайте что-то уникальное, например, 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
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 Report.