Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы бд.doc
Скачиваний:
28
Добавлен:
04.11.2018
Размер:
1.37 Mб
Скачать
  1. Pl/sql. Триггеры

Думаю, самое время заняться еще одним типом именованных блоков PL/SQL, а именно триггеры таблиц БД. Сам по себе триггер БД, является именованным блоком PL/SQL и после компиляции хранится, в соответствующих словарях данных вашей БД. Но он имеет ряд особенностей. Процедуры или функции, которые мы с вами уже разбирали могут вызывать или быть вызваны другими процедурами, при этом им могут быть переданы параметры. Триггер - не может быть вызван из другой процедуры БД и не принимает никаких параметров при вызове. Само название говорит о том, что этот блок PL/SQL - срабатывает при определенном событии, а именно при запуске операций DML - INSERT, UPDATE, DELETE. Существуют так же так называемые системные триггеры, которые срабатывают на события самой БД. Но о них чуть позже. В основном триггеры используются для:

  1. Реализации сложных ограничений целостности данных, которые невозможно осуществить через описательные ограничения, устанавливаемые при создании таблиц.

  2. Организации всевозможных видов аудита. Например, слежения за изменениями в какой-либо важной таблице БД.

  3. Автоматического оповещения других модулей о том, что делать в случае изменения информации содержащейся в таблице БД.

  4. Для реализации так называемых "бизнес правил".

  5. Для организации каскадных воздействий на таблицы БД.

В принципе по ходу работы можете придумать еще что-нибудь! Вообще триггеры очень удобная и полезная вещь в БД. Так же триггеры имеют определенные правила активации (firing), а именно:

  1. До момента сработки одного из операторов DML - INSERT, UPDATE, DELETE.

  2. После момента сработки одного из операторов DML - INSERT, UPDATE, DELETE.

Синтаксис команды для создания триггера, следующий:

--- CREATE [OR REPLACE] TRIGGER имя_триггера ---------------------

--- BEFORE | AFTER активизирующее_событие ON ссылка_на_таблицу ---

--- FOR EACH ROW [WHEN условие_срабатывания] ---------------------

--- тело_триггера ------------------------------------------------

Где:

  • имя_триггера - собственно имя вашего триггера.

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

  • ссылка_на_таблицу - собственно таблица, для которой создан триггер.

  • FOR EACH ROW - если указано активируется от воздействия на строку если нет, то после любого оператора DML.

  • условие_срабатывания - если TRUE триггер срабатывает, если FALSE нет.

  • тело_триггера - собственно тело триггера.

Для полноты картины определимся с таким фактом, что триггеры имеют собственное пространство имен (namespace). Что это означает, само понятие namespace - применимо вообще во многих языках программирования. В пределах одного пространства имен не может быть двух функций или процедур с одинаковым именем! Так вот, так как пространство имен у триггеров свое, то может иметь место ситуация, когда какой-либо триггер имеет тоже имя, что и процедура или функция в пределах одной схемы (не путать с пространством имен это разные вещи!). Но двух триггеров с одинаковым именем не бывает! Так же триггер, может иметь имя совпадающее с именем таблицы, для которой он создан. Но лучше этого не делать, а дать триггеру имя указывающее на то, что он производит! Вообще, по моему мнению, такое понятие как имя для триггера по большому счету архаично! Ведь триггер нельзя "позвать" из процедуры или функции - это запрещено! Так нафига ему имя! Можно было сделать что-то вроде универсальной цифровой маркировки. Хотя имя дает триггеру осмысленность, что улучшает чтение кода БД! Теперь давайте посмотрим на типы триггеров и моменты срабатывания и что все это значит. Итак:

Категории

Значение

Комментарии

Оператор

INSERT, UPDATE, DELETE

Определяет какой оператор DML вызывает активацию (firing) триггера.

Момент времени

BEFORE, AFTER

Определяет момент активации триггера: до или после выполнения оператора.

Уровень

Строка или оператор

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

Если посмотреть внимательнее, то значения заданные для оператора, момента времени и уровня, определяют тип триггера. Всего получается 12 возможных типов - 3 оператора, 2 момента времени, 2 уровня. Количество триггеров, для отдельной таблицы в принципе не ограничивается в версии Oracle 8i и выше, но делать их слишком много нет смысла. Так же триггер может срабатывать от нескольких операторов DML, если это необходимо. Вот собственно, основная теоретическая часть по триггерам БД. Далее попробуем это на практике.

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