Tuesday, November 28, 2006

LOGON_TIME, для трассировки сессий, запущенных на одном хосте

Если пользователи используют базу через вебинтерфейс приложения, запущенного под каким-то пользователем 'user', то можно использовать хотя бы LOGON_TIME для идентификации sid'а интересующей сессии, по которой нужно сделать трассировку.
Например, для включения трассировки своей сессии, запускаем веб-приложение, регистрируемся и включаем трассировку след.образом:
select sid,serial#,osuser,TO_CHAR(logon_time, 'DD.MM.YYYY HH24:MI') "logon_time" from v$session where osuser='user';

Определяем по logon_time свою сессию и включаем трассировку своей сессии
exec sys.dbms_system.set_ev(sid,serial,10046,12,'');
и повторяем проблемные "щелчки", о которых сообщил юзер


===========
Также полезно использовать триггер after logon на включение трассировки
(после трассировки не забыть отключить его через alter trigger trace_login_trigger disable)
CREATE OR REPLACE TRIGGER trace_login_trigger
AFTER logon ON DATABASE
BEGIN
IF (USER = <'USERNAME'>) THEN
EXECUTE IMMEDIATE 'ALTER SESSION SET EVENTS ''10046 trace name
context forever, level 12';
END IF;
END;

2 comments:

pinbol said...

Иногда в таком случае полезно включить множественную трассировку сессий по пользователю

--Скрипт для включения трассировки всех сессий пользователя USER
begin
For pList in (select sid,serial# from v$session where username='USER') loop
sys.dbms_system.set_ev(pList.sid,pList.serial#,10046,12,'');
End loop;
end;
--Скрипт для выключения трассировки всех сессий пользователя USER
begin
For pList in (select sid,serial# from v$session where username='USER') loop
sys.dbms_system.set_ev(pList.sid,pList.serial#,10046,0,'');
End loop;
end;

pinbol said...

В 10gR2 удобнее и безопаснее использовать пакет dbms_monitor.

select sid,serial# from v$session;
exec dbms_monitor.session_trace_enable(144, 253, TRUE, FALSE);