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

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

Триггер - это специальный вид хранимой программы PL/SQL, который ассоциирован с конкретной таблицей базы данных. Триггер автоматически запускается каждый раз, когда выполняется оператор SQL INSERT, UPDATE либо DELETE, вносящий изменения в эту таблицу. формальное описание триггера.

CREATE [ OR REPLACE ] TRIGGER [имясхемы.]имятриггера

{AFTER | BEFORE} {INSERT | UPDATE [OF списокстолбцов]| DELETE }

ON ассоциированнаятаблица

[FOR EACH ROW] [WHEN ограничениетриггера]

[DECLARE

описания]

BEGIN

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

END [имятриггера];

Выполнение триггера может завершиться либо нормально либо генерацией исключительной ситуации (вызовом процедуры raise_application_error). В последнем случае выполнение всего оператора DML прекращается, и выполняется откат к созданной неявно контрольной точке.

При написании триггеров необходимо соблюдать следующие ограничения:

  • запрещается использовать операторы управления транзакциями как в самом триггере, так и в подпрограммах, которые этот триггер вызывает;

  • в теле триггера нельзя объявлять переменные с типами LONG и LONG RAW.

  • из тела триггера нельзя обращаться к т.н. изменяющимся таблицам (mutating tables). Обсуждение вопросов, связанных с изменяющимися таблицами, будет выполнено позднее в этом разделе.

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

IF :new.minsalary < :old.minsalary THEN

Триггеры предназначены для решения следующих задач:

  • поддержка логической целостности базы данных, особенно в тех случаях, когда недостаточно встроенных ограничений или если данные находятся в различных узлах распределенной базы данных;

  • реализация сложных бизнес-правил;

  • контроль доступа к базе данных;

  • выполнение специфического аудита изменений в базе данных;

отслеживания системных событий

Пример Напишем триггер, который заполняет пустыми значениями поле deptno в таблице career при удалении соответствующего подразделения из таблицы dept.

CREATE OR REPLACE TRIGGER dept_bd1

BEFORE DELETE ON dept

FOR EACH ROW

BEGIN

UPDATE career SET deptno = NULL

WHERE deptno=:old.deptno;

END dept_bd1;

Из тела триггера можно обращаться не ко всем таблицам и столбцам. Чтобы определить, к каким табли­цам возможен доступ, необходимо ввести понятие изменяющихся и ограничивающих таблиц. Изменяющаяся таблица— это таблица, которая в данный момент модифицируется опера­тором DML. Для триггера это та таблица, для которой он был создан. Таблицы, обновляющиеся в резу­льтате реализации ограничений ссылочной целостности ON DELETE CASCADE (каскадного удаления), также являются изменяющимися. Ограничивающая таблица— это таблица, ин­формация которой может быть считана при реализации ограничения ссылочной целостности.

Триггеры Oracle не могут:

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

  • считывать или модифицировать информацию столбца первичного ключа, уникальных столбцов и столбцов внешних ключей таблицы, являющейся ограничивающей по отношению к изменяющейся таблице. С другими столбцами можно работать без каких-либо ограничений.

Эти правила верны для всех строковых триггеров. Для операторных триггеров они применимы то­лько в тех случаях, когда те активизируются в результате выполнения операции каскадного удаления ин­формации.Модификация триггеров

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

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

ALTER TABLE students ENABLE ALL TRIGGERS;

Анализировать состояние триггера можно, выполнив запрос к элементу словаря данных user_triggers, например:

SELECT trigger_name, table_name, triggering_event, status

FROM user_triggers;

для удаления триггера достаточно выполнить команду

DROP TRIGGER имятриггера;

Кроме триггеров, позволяющих реагировать на события, связанные с изменениями в таблицах базы данных, Oracle дает возможность отслеживать некоторые другие события.Триггер INSTEAD OF может быть применен к представлению, образованному в результате соединения нескольких таблиц. Если поле, объявленное как первичный ключ в одной из исходных таблиц, может несколько раз повториться в представлении, то такое представление является не модифицируемым. Однако триггер скрывает от пользователей эту особенность.С помощью триггера можно отслеживать модификацию объектов базы данных. В этом случае условия этих триггеров записываются как {BEFORE | AFTER} {ALTER | CREATE | DROP |…} ON {SCHEMA | DATABASE}

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