В. Бегун. Некоторые недокументированные процедуры пакета DBMS_SYSTEM

21 сентября 2000 г.

Системный пакет 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#
 FROM v$session
 WHERE username = 'J'

 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);

Vladimir Begun
Sunbay Software AG
Oracle DBA/Technical Project Manager
mailto:VladimirBegun@yahoo.com
http://www.sunbay.crimea.ua/~jester http://www.zdnet.ru/advertisement/advertisement.asp?ID=5713http://www.zdnet.ru/advertisement/advertisement.asp?ID=5713

Хостинг от uCoz