В
В. Бегун. Некоторые недокументированные процедуры пакета 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#
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);
Vladimir Begun
Sunbay Software AG
Oracle DBA/Technical Project Manager
mailto:VladimirBegun@yahoo.com
http://www.sunbay.crimea.ua/~jester
|