Как найти последние 10 запросов оракула по имени пользователя?

Не уверен, что это возможно. Я на 10g. Конечный результат будет выглядеть следующим образом:

Username      | Date/Time            | sqltext 
jdoe          | 3/21/11 10:32:27     | select sum(total) from sales where in_date > '08-JAN-11' 
jdoe          | 3/21/11 10:32:21     | delete from products_old 
jdoe          | 3/21/11 10:32:18     | select item, description from products where item = 'blah' 
jdoe          | 3/21/11 10:32:06     | select count(item) from products 
jdoe          | 3/21/11 10:31:44     | describe products

Похоже, что v $sql хранит почти (?) все запросы sql, которые когда-либо отправлялись, но к чему я присоединяюсь, чтобы получить имя пользователя и дату?

Ответ 1

Если у вас есть корпоративная версия и пакет производительности и настройки (в противном случае запросы к таблицам AWR нарушают вашу лицензию), представление V$ACTIVE_SESSION_HISTORY будет самым близким, которое вы получите. Это будет фиксировать каждую секунду то, что выполнялось каждым активным сеансом. Если у вас есть пользователь, выполняющий множество операторов SQL в секунду, или ваши операторы SQL достаточно быстры, чтобы они не были активны на определенной второй границе, однако, не каждый запрос был бы захвачен. Если вы просто пытаетесь получить общую выборку из последних 10 вещей, которые был сделан конкретным пользователем (с уклоном к поиску более длинных запросов), AWR должен быть достаточным. Но если вы пытаетесь сделать что-то вроде прослеживания того, что пользователь делает в своей сессии, AWR не подходит.

Если вы хотите захватить абсолютно все, что делает пользователь, вам нужно будет проследить сеанс. Это приведет к созданию на сервере довольно объемного файла трассировки, который можно обобщить с помощью утилиты tkprof. Но для этого требуется, чтобы вы включили трассировку для определенного сеанса перед выполнением SQL-интереса - это не то, что можно сделать ретроактивно.

Если вас интересуют только изменения, сделанные сеансом, вы можете использовать LogMiner для просмотра журналов повтора, чтобы узнать, что делает пользователь. Это можно сделать ретроактивно, но поскольку инструкции SELECT не генерируют REDO, они не будут записываться в журналы повтора и будут невидимы для LogMiner.

Ответ 2

Если вы используете JDBC, вы всегда можете использовать библиотеку обложек Log4jdbc. Он регистрирует всю активность jdbc - вы догадались - log4j.

Вы можете настроить уровень журнала для нескольких типов событий, он показывает выданную sql (с заменой переменных привязки их значениями) и информацией о времени. Я использую его все время.