|
Навигация
|
Главная » Sql
Новое в 8i: триггеры событий в СУБД
Владимир Пржиялковский Из новых видов триггеров, пополнивших арсенал разработчика в версии 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
| При написании триггера нужно учитывать следующие обстоятельства: - При запуске триггера событий в СУБД Oracle открывает автономную транзакцию, осуществляет сам запуск и фиксирует (commit) выполнение всех DML-операций безотносительно к логике транзакций пользователя.
- В определении триггеров LOGON, STARTUP и SERVERERROR можно указывать только слово AFTER. Если указать BEFORE, при трансляции будет выдана ошибка.
- Аналогично, в определении триггеров LOGOFF и SHUTDOWN можно указывать только BEFORE.
- Обращения из процедур DBMS_OUTPUT не дадут на экране никакой выдачи в пределах текущего сеанса. Для того, чтобы как-то записать информацию, нужно будет воспользоваться записью в таблицы, в файл ОС или средством pipeline.
- Триггер на SERVERERROR не срабатывает на следующие пять событий: ORA-01403, ORA-01422, ORA 04030, ORA-01034 и ORA-01007.
Триггеры событий в СУБД могут использоваться в разных целях: для прикрепления объектов к SGA при старте системы, для отслеживания входов в БД, для трассировки ошибок. Так, прикрепление наиболее часто используемых пакетов в 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 OLAP 11g. Часть 1.
Как я сдавал экзамены на OCP.
Критерии выбора СУБД при создании информационных систем.
Новая версия корпоративного решения управления данными Sybase Adaptive Server Enterprise 15.7.
Главная » Sql
|
|