Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СУБД Oracle / Лекции / Лек_ORAC / LA / Триггеры.doc
Скачиваний:
45
Добавлен:
16.04.2013
Размер:
81.41 Кб
Скачать

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 имя_триггера;

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Мы не исправляем ошибки в тексте (почему?), но будем благодарны, если вы все же напишите об ошибках.

Соседние файлы в папке LA