- •Примеры применения триггеров в PL / SQL
- •Задачи, требующие применения триггеров
- •Реализация комплексных ограничений контроля
- •Триггер, контролирующий вводимые значения (1)
- •Триггер, контролирующий вводимые значения (2)
- •Триггер, контролирующий вводимые значения (3)
- •Триггер, контролирующий вводимые значения (4)
- •Процедура RAISE_APPLICATION_ERROR
- •Типы триггеров
- •Типы триггеров
- •Типы триггеров
- •Типы триггеров
- •Пример триггера
- •Пример триггера
- •Модификация триггеров
- •Тонкости, касающиеся триггеров (1)
- •Тонкости, касающиеся триггеров (2)
- •Тонкости, касающиеся триггеров (3)
- •Пример триггера (1)
- •Пример триггера (2)
- •Пример триггера (3)
Примеры применения триггеров в 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 отсутствует, то при наступлении триггерного события триггер выполняется только один раз (операторный триггер).