2 After update of sal on emp
3 DECLARE
4 v_salary_changes NUMBER;
5 v_max_changes NUMBER;
6 BEGIN
7 SELECT upd, max_upd
8 INTO v_salary_changes, v_max_changes
9 FROM audit_table
10 WHERE user_name = user
11 AND table_name = 'EMP'
12 AND column_name = 'SAL';
13 IF v_salary_changes > v_max_changes THEN
14 RAISE_APPLICATION_ERROR (-20501,
15 'You may only make a maximum of '||
16 TO_CHAR (v_max_changes) ||
17 'changes to the SAL column');
18 END IF;
19 END;
20 /
Пример триггера BEFORE. Нестандартная проверка целостности вводимых данных.
SQL>CREATE OR REPLACE TRIGGER check_salary
2 BEFORE UPDATE OF sal ON emp
3 FOR EACH ROW
4 WHEN (new.sal < old.sal) OR
5 (new.sal > old.sal * 1.1)
6 BEGIN
7 RAISE_APPLICATION_ERROR (-20508,
8 'Do not decrease salary nor increase by' ||
9 ' more than 10%.');
10 END check_salary;
11 /
Триггеры BEFORE чаще всего используются в следующих целях:
Чтобы определить с помощью триггера, следует ли разрешить завершение команды, вызывающей срабатывание триггера. Это позволяет избежать бесполезной обработки команды, по которой срабатывает триггер, а также возможного отката в случае, если во время выполнения действий триггера возбуждается исключение.
Чтобы вычислить производные значения столбцов до завершения команды INSERT или UPDATE, по которой срабатывает триггер.
Триггеры AFTER чаще всего используются в следующих целях:
Если вы хотите завершить выполнение команды, по которой срабатывает триггер, прежде чем будет выполнено действие триггера.
Если уже имеется триггер BEFORE, то триггер AFTER может выполнить какое-то другое действие по одной и той же DML-команде.
Триггеры INSTEAD OF обычнообеспечивают прозрачный способ изменения представлений, которые не подлежат изменению по своей природе и, следовательно, не могут быть изменены просто обычными DML-командами языка SQL. В результате вы можете применить к представлению обычные команды INSERT, UPDATE и DELETE, а триггер INSTEAD OF в фоновом режиме выполняет действие, закодированное в теле триггера, прямо над одной или несколькими таблицами, лежащими в основе представления.
Управление триггерами.
Когда триггер только создается, он включается автоматически.
Для включенных триггеров сервер Oracleпроверяет ограничения и гарантирует, что триггеры не могут нарушить никакие правила целостности. Кроме того, серверOracleгарантирует согласованное чтение для запросов и ограничений, управляет зависимостями и обеспечивает двухфазную фиксацию транзакций, если триггер обновляет удаленные таблицы в распределенной базе данных.
Отключить конкретный триггер можно с помощью команды ALTERTRIGGER; отключитьвсетриггеры таблицы можно с помощью командыALTERTABLE.
ALTER TRIGGER имя_триггера {ENABLE | DISABLE};
ALTER TABLE имя_таблицы {ENABLE|DISABLE} ALL TRIGGERS;
Триггер можно выключать для повышения производительности или для подавления проверок на соблюдение правил целостности при загрузке больших объемов данных с помощью таких утилит, как SQL*Loader. Иногда приходится отключать триггер, если он ссылается на объект базы данных, недоступный в данный момент из-за ошибки соединения, отказа диска, автономного файла данных или автономного табличного пространства.
Для удаления триггера используется инструкция:
DROP TRIGGER имя_триггера;