Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Shpory_BD.doc
Скачиваний:
57
Добавлен:
26.09.2019
Размер:
254.46 Кб
Скачать

17. Триггеры Объявление, назначение и примеры использования. Модификация триггеров.

Триггер - это специальный вид хранимой программы PL/SQL, который ассоциирован с конкретной таблицей базы данных. Триггер автоматически запускается (возбуждается, активизируется, английский термин – firing) каждый раз, когда выполняется оператор SQL INSERT, UPDATE либо DELETE, вносящий изменения в эту таблицу. Итак, в отличие от подпрограмм, которые должны вызываться явно, триггер базы данных вызывается неявно. Триггер возбуждается при наступлении следующих событий: до начала выполнения операций INSERT, UPDATE либо DELETE, а также после окончания выполнения этих операций. Кроме того, можно написать отдельные триггеры, выполняющиеся для каждой строки, участвующей в обновлении базы данных (строковые триггеры). Дадим формальное описание триггера.CREATE [ OR REPLACE ] TRIGGER [имясхемы.]имятриггера {AFTER | BEFORE} {INSERT | UPDATE [OF списокстолбцов]| DELETE } ON ассоциированнаятаблица [FOR EACH ROW] [WHEN ограничениетриггера] [DECLARE описания] BEGIN телотриггера END [имятриггера];Фраза FOR EACH ROW описывает строковый триггер, который будет выполняться при обработке каждой строки. Фраза WHEN дает возможность запускать триггер только при выполнении дополнительных ограничений. Если один триггер используется для различных операций модификации, названия этих операторов можно объединить через оператор OR, например: AFTER INSERT OR UPDATE.

Триггеры запускаются в следующем порядке:

триггер before для оператора (т.е. без фразы FOR EACH ROW);строковый триггер before, который отрабатывает для первой модифицируемой строки; строковый триггер after, который отрабатывает для первой модифицируемой строки; строковые триггеры after и before, работающие для второй и последующих строк;триггер after для оператора (т.е. без фразы FOR EACH ROW).При активизации каждого из триггеров видны изменения, сделанные предыдущими триггера­ми, а для триггеров AFTER - также внесенные оператором DML. При написании триггеров необходимо соблюдать следующие ограничения:

запрещается использовать операторы управления транзакциями как в самом триггере, так и в подпрограммах, которые этот триггер вызывает;в теле триггера нельзя объявлять переменные с типами LONG и LONG RAW. Кроме того, с помощью префиксов :new и :old, которые будут описаны позднее, нельзя ссылаться на столбцы типов LONG и LONG RAW таблицы, для которой определен триггер;из тела триггера нельзя обращаться к т.н. изменяющимся таблицам (mutating tables).

В теле строкового триггера можно использовать префиксы :new и :old, которые иногда называют коррелирующими именами.

Триггеры, в отличие от обычных хранимых подпрограмм, триггеры компилируются автоматически при каждом возбуждении, если из-за изменений влияющих на него объектов они становятся недействительными. Поэтому для них не имеет смысла определять статус VALID или INVALID. Однако можно, не удаляя триггер, запретить (disable) или вновь разрешить (enable) его исполь­зование. Когда триггер запрещен, он по-прежнему находится в словаре данных, но никогда не активизи­руется. Для запрещения или разрешения триггера применяется оператор

ALTER TRIGGER имятриггера {DISABLE | ENABLE};

При создании каждого триггера его использование по умолчанию разрешено. Кроме того, при помощи команды ALTER TABLE можно разрешить или запретить использование всех триггеров определенной таблицы, если добавить в эту команду конструкцию ENABLE ALL TRIGGERS (разрешить все триггеры) или DISABLE ALL TRIGGERS (запретить все триггеры).

Так, триггер INSTEAD OF может быть применен к представлению, образованному в результате соединения нескольких таблиц. Если поле, объявленное как первичный ключ в одной из исходных таблиц, может несколько раз повториться в представлении, то такое представление является не модифицируемым. Кроме того, с помощью триггера можно отслеживать модификацию объектов базы данных. В этом случае условия этих триггеров записываются как

{BEFORE | AFTER} {ALTER | CREATE | DROP |…} ON {SCHEMA | DATABASE}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]