Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Работа с Oracle / Примеры применения триггеров.ppt
Скачиваний:
6
Добавлен:
28.06.2021
Размер:
300.03 Кб
Скачать

Примеры применения триггеров в PL / SQL

Задачи, требующие применения триггеров

Изощренный аудитинг.

Предотвращение незаконных транзакций.

Обеспечения ссылочной целостности между узлами в распределенной базе данных.

Реализация сложных организационных правил.

Ввод в действие комплексных правил защиты.

Прозрачная регистрация событий.

Автоматическая генерация значений вычисляемых столбцов.

Поддержание синхронных дублирований таблиц.

Реализация комплексных ограничений контроля

Триггеры могут реализовывать правила целостности, отличные от ссылочной целостности.

Следующий триггер выполняет сложную проверку (размер жалованья служащего), прежде чем разрешает выполниться предложению триггера (вставка или модификация данных о служащем).

Комментарии внутри кода объясняют, что делает этот триггер.

Триггер, контролирующий вводимые значения (1)

CREATE TRIGGER salary_check BEFORE INSERT OR UPDATE OF sal, job_classification ON emp FOR EACH ROW

DECLARE

minsal NUMBER; maxsal NUMBER;

salary_out_of_range EXCEPTION;

Триггер, контролирующий вводимые значения (2)

BEGIN

/* Извлечь в MINSAL и MAXSAL минимальное и максимальное жалованья из справочной таблицы SALGRADE по заданной новой должности сотрудника. */

SELECT minsal, maxsal INTO minsal, maxsal FROM salgrade

WHERE job_classification = :NEW.job_classification ;

Триггер, контролирующий вводимые значения (3)

/* Если новое жалованье сотрудника выходит за допус- тимый диапазон, возбуждается исключение, возвраща- ется сообщение об ошибке, и висящее предложение INSERT или UPDATE, которое возбудило триггер, откатывается */

IF ( :NEW.sal < minsal OR :NEW.sal > maxsal) THEN RAISE salary_out_of_range ;

END IF ;

Триггер, контролирующий вводимые значения (4)

EXCEPTION

WHEN salary_out_of_range THEN RAISE_APPLICATION_ERROR (-20300, 'Salary ' || TO_CHAR(:NEW.sal) || ' out of range for job classification ' || :NEW.job_classification || ' for

employee ' || :NEW.name); WHEN NO_DATA_FOUND THEN

RAISE_APPLICATION_ERROR (-20322, 'Invalid Job Classification ' || :new.job_classification);

END;

Процедура RAISE_APPLICATION_ERROR

Исключение в триггере вызывает стандартную процедуру RAISE_APPLICATION_ERROR.

Программа PL/SQL может вызвать эту процедуру для гене- рирования исключения и возвращения в вызывающую про- грамму задаваемых пользователем номера ошибки (SQLCODE) и текста сообщения (SQLERRM).

Вызов процедуры должен включать по меньшей мере два параметра:

определяемый­ пользователем номер ошибки в диапазоне (от -20000 до -20999);

строка длиной­ до 2048 байт, выступающая в качестве задаваемого пользователем­ сообщения об ошибке.

Типы триггеров

Момент_срабатывания определяет, когда сработает триг- гер: до (BEFORE) или после (AFTER) наступления триггер- ного события (выполнения запускающего оператора).

Если указано BEFORE, триггер выполняется до каких-либо проверок ограничений на строки, затрагиваемые триггер- ным событием. Строки не блокируются. (BEFORE-триггер).

Если указано AFTER, то триггер выполнется после того, как запускающий оператор завершит свою работу. и будут выполнены проверки всех ограничений. Затрагиваемые строки блокируются на время выполнения триггера. (AFTER-триггер).

Типы триггеров

Триггерное_событие может принимать значения INSERT, UPDATE или DELETE.

Триггерное_ограничение одно и более дополнительных условий, которые должны быть выполнены для срабатыва- ния триггера.

FOR EACH ROW указывает на необходимость выполнить тело триггера для каждой строки, затрагиваемой запускаю- щим оператором (строчный триггер).

Если FOR EACH ROW отсутствует, то при наступлении триггерного события триггер выполняется только один раз (операторный триггер).