ПУБЛИКАЦИЯ |
30.08.00
|
Владимир Пржиялковский
Из новых видов триггеров, пополнивших арсенал разработчика в
версии 8i, шесть уже нашли свое отражение в одном из более ранних выпусков
“Мастерской Oracle”. Это так называемые “триггеры
для событий уровня схемы БД” (schema-level event triggers). Здесь можно
поговорить еще о пяти: о “триггерах для событий уровня системы” (database-level
event triggers). Они запускаются при возникновении в системе (СУБД) следующих
событий:
Событие | Описание триггера |
SERVERERROR | Триггер срабатывает при возникновении серверной ошибки |
LOGON | Триггер срабатывает при успешном подключении к системе клиентского приложения |
LOGOFF | Триггер срабатывает перед отключением клиентского приложения от СУБД |
STARTUP | Триггер срабатывает немедленно после открытия БД |
SHUTDOWN | Триггер срабатывает непосредственно перед попыткой закрыть СУБД “нормальным образом”, то есть всеми вариантами команды SHUTDOWN кроме варианта SHUTDOWN ABORT |
Общий синтаксис описания триггеров схемы таков:
CREATE [ OR REPLACE ] TRIGGER имя_триггера
{ BEFORE | AFTER }
{ SERVERERROR | LOGON | LOGOFF | STARTUP | SHUTDOWN }
ON DATABASE
BEGIN
текст на PL/SQL
END;
С каждым событием из таблицы выше связано несколько атрибутов. Фактически
эти атрибуты – системные функции, возвращающие при обращении к ним из тела
триггера некоторый результат. Ниже эти атрибуты перечисляются, причем первые
шесть из них нам уже знакомы по триггерам событий уровня схемы.
Имя | Тип | Описание |
SYSEVENT | VARCHAR2(30) | Имя системного события, активизировавшего триггер |
LOGIN_USER | VARCHAR2(30) | Имя пользователя, вышедшего на сеанс работы с Oracle |
INSTANCE_NUM | NUMBER | Имя экземпляра СУБД |
DATABASE_NAME | VARCHAR2(50) | Имя БД |
SERVER_ERROR | NUMBER | Функция, возвращающая номер ошибки на указанном месте магазина ошибок. 1 соответствует верхушке магазина. Пример: SERVER_ERROR(2) выдаст номер ошибки на втором от верха месте в магазине. |
IS_SERVERERROR | BOOLEAN | Функция, возвращающая TRUE при наличии указанной ошибке в текущем магазине ошибок; FALSE в противном случае. |
Вот какие правила и атрибуты свойственны каждому событию:
Событие | Правило | Атрибуты |
SERVERERROR | По умолчанию триггер будет срабатывать при всех событиях. Однако специальным указанием можно “сказать”, чтобы триггер срабатывал только при интересующих нас событиях. | SYSEVENT
LOGIN_USER INSTANCE_NUM DATABASE_NAME SERVER_ERROR IS_SERVERERROR |
LOGON | Условие можно указать, воспользовавшись USERID( ) или USERNAME( ) | SYSEVENT
LOGIN_USER INSTANCE_NUM DATABASE_NAME |
LOGOFF | Условие можно указать, воспользовавшись USERID( ) или USERNAME( ) | SYSEVENT
LOGIN_USER INSTANCE_NUM DATABASE_NAME |
STARTUP | В теле триггера не допускается использование операций с БД – DML и запросов. Можно, однако, запускать программы (например, listener), закреплять в SGA пакеты и т. д. | SYSEVENT
LOGIN_USER INSTANCE_NUM DATABASE_NAME |
SHUTDOWN | В теле триггера не допускается использование операций с БД – DML и запросов. Можно, однако, останавливать программы (например, listener), или запускать (например, сбора статистики работы СУБД и занесения ее в журнал) | SYSEVENT
LOGIN_USER INSTANCE_NUM DATABASE_NAME |
При написании триггера нужно учитывать следующие обстоятельства:
Так, прикрепление наиболее часто используемых пакетов в SGA при старте системы может (в случае интенсивной загрузки СУБД) ускорить среднее время обращения к процедурам этих пакетов (они не будут участвовать в страничном обмене) и уменьшить отрицательные последствия, вызванные фрагментацией динамически выделяемого пространства SGA в процессе работы. Следующий пример Стивена Фойерстина показывает, как можно таким образом закрепить в SGA пакеты STANDARD и DBMS_STANDARD, встроенные в систему:
CREATE OR REPLACE TRIGGER pin_code_on_startup
AFTER STARTUP ON DATABASE
BEGIN
DBMS_SHARED_POOL.KEEP (‘SYS.STANDARD’, ‘P’);
DBMS_SHARED_POOL.KEEP (‘SYS.DBMS_STANDARD’, ‘P’);
END;
/Для закрепления пользовательских пакетов, включающих требуемые процедуры или функции, можно самостоятельно составить более сложные схемы, базирующиеся в конце-концов на триггере AFTER STARTUP.
Литература
Oracle PL/SQL Programming. Steven Feuerstein. O’Reilly & Associates,
October 1999.
Документация по Oracle
Interface Ltd.Отправить E-Mail http://www.interface.ru |
|
Ваши замечания и предложения отправляйте автору По техническим вопросам обращайтесь к вебмастеру Документ опубликован: 30.08.00 |