Системный пакет Oracle DBMS_SYSTEM содержит ряд весьма интересных недокументированных процедур, которые могут оказаться полезными в определенных ситуациях, таких как трассировка событий и вывод отладочной информации в рабочие файлы Oracle-trace и alert.
Процедура dbms_system.set_ev устанавливает событие для сессии.
PROCEDURE set_ev (
si BINARY_INTEGER
, se BINARY_INTEGER
, ev BINARY_INTEGER
, le BINARY_INTEGER
, nm VARCHAR2
);
si - идентификатор сессии sid из представления v$session
se - идентификатор сессии serial# из представления v$session
ev - номер события ["event number"]
le - уровень выдачи отладочной информации
nm - имя события
Процедура dbms_system.read_ev проверяет уровень выдачи отладочной информации для сессии.
PROCEDURE read_ev (
iev BINARY_INTEGER
, oev OUT BINARY_INTEGER
);
iev - номер проверяемого события ["event number"]
oev - уровень выдачи отладочной информации
Процедура возвращает следущие значения:
0 - событие для сессии не установлено
n - где n > 0, уровень выдачи отладочной информации для текущей сессии
Процедура dbms_system.ksdwrt выводит отладочную информацию в рабочие файлы Oracle.
PROCEDURE ksdwrt (
dest BINARY_INTEGER
, tst VARCHAR2
);
dest - определяет файл для выдачи сообщений:
1 - trace файл
2 - alter файл
3 - trace и alter файл
tst - сообщение, максимальная длина 1023 символа. Следует также обратить внимание на то, что NULL значения параметра tst не будут выводиться в файл.
Процедура dbms_system.ksdddt выводит текущую дату и время в пользовательский trace файл.
PROCEDURE ksdddt;
Формат вывода 2000.09.18.09.16.47.467
Процедура dbms_system.ksdind печатает разделитель в trace файл.
PROCEDURE ksdind (
lvl BINARY_INTEGER
);
lvl - определяет сколько раз печатать разделитель ":". Максимальное значение lvl - 30.
Процедура может быть полезна для печати трассировочной информации.
Пример использования:
Рассмотрим две открытых сессии SQL*PLUS:
пусть сессия "A" - сессия, отрытая пользователем SYS, а сессия "B" - сессия, отрытая пользователем J.
Пользователю J дана привилегия на запуск кода пакета dbms_system["GRANT EXECUTE ON dbms_system TO j;"]
Сессия "A":
Начало трассировки SQL для сессии пользователя J
SQL> SELECT sid, serial#
2 FROM v$session
3 WHERE username = 'J'
4 /
SID SERIAL#
--------- ---------
7 27
BEGIN
dbms_system.set_ev(7, 27, 10046, 10, '');
END;
/
Сессия "B":
Проверка пользователем J статуса его сессии.
VAR n NUMBER;
BEGIN
sys.dbms_system.read_ev(10046, :n);
sys.dbms_system.ksdwrt(3, 'Hello, DBA! =;)');
sys.dbms_system.ksdwrt(1,
'1 TRACE FILE: event level = ' || :n);
sys.dbms_system.ksdind(:n);
sys.dbms_system.ksdddt;
sys.dbms_system.ksdwrt(2,
'2 ALERT FILE: event level = ' || :n);
sys.dbms_system.ksdind(:n);
sys.dbms_system.ksdddt;
sys.dbms_system.ksdwrt(3,
'3 TRACE AND ALERT FILE: event level = ' || :n);
sys.dbms_system.ksdddt;
END;
/
PRINT n
N
---------
10
Итак, пользователь J выяснил, что его сессия находиться под "контолем", с уровнем выдачи отладочной информации 10. Он передал привет DBA и записал уровень отладочной информации в trace и alert файлы.
Сессия "A":
Завершения трассировки SQL для сессии пользователя J
BEGIN
dbms_system.set_ev(7, 27, 10046, 0, '');
END;
/
Пример для сессии "A", приведенный выше-это аналог функции dbms_system.set_sql_trace_in_session(sid, serial#, sql_trace);
Литература по Oracle
|