Технологии бд теоретические основы организации бд. Реляционная модель данны



страница13/20
Дата23.04.2016
Размер2.56 Mb.
1   ...   9   10   11   12   13   14   15   16   ...   20

3.6.Работа с триггерами

3.6.1.Общие сведения о триггерах


Триггеры - это хранимые процедуры, связанные с некоторыми событиями, происходящими во время работы базы данных. В качестве таких событий выступают операции вставки, обновления и удаления строк таблиц. Если в базе данных определен некоторый триггер, то он запускается автоматически всегда при возникновении события, с которым этот триггер связан. Очень важным является то, что пользователь не может обойти триггер. Триггер срабатывает независимо от того, кто из пользователей и каким способом инициировал событие, вызвавшее запуск триггера. Таким образом, основное назначение триггеров - автоматическая поддержка целостности базы данных. Триггеры могут быть как достаточно простыми, например, поддерживающими ссылочную целостность, так и довольно сложными, реализующими какие-либо сложные ограничения предметной области или сложные действия, которые должны произойти при наступлении некоторых событий. Например, с операцией вставки нового товара в накладную может быть связан триггер, который выполняет следующие действия - проверяет, есть ли необходимое количество товара, при наличии товара добавляет его в накладную и уменьшает данные о наличии товара на складе, при отсутствии товара формирует заказ на поставку недостающего товара и тут же посылает заказ по электронной почте поставщику.
По событию изменения триггеры различают на вызываемые при:

  • Добавлении новой записи

  • Изменении существующей записи

  • Удалении записи

По отношению к событию, влекущему их вызов, триггеры различаются на:

  • Выполняемые до наступления события

  • Выполняемы после наступления события


Особенности триггеров:

  • Непосредственно обратиться к триггеру нельзя

  • Нельзя передавать параметры и получать значения выходных параметров

  • Триггер всегда реализует действие

Преимущества использования триггеров:

  • Автоматическое обеспечение каскадных воздействий, выполняющихся на сервере.

  • Изменения в триггерах не влекут необходимости изменения клиентских приложений.

  • Обязательное выполнение бизнес-правил, реализованных с использованием триггеров для всех приложений работающих с БД.

  • Все изменения вносимые триггером выполняются в рамках одной транзакции. Как следствие, при откате транзакции откатываются также и все изменения, внесенные в БД триггерами.

3.6.2.Создание триггеров


Триггер создается оператором:

CREATE TRIGGER ИмяТриггера FOR ИмяТаблицы

[ ACTIVE | INACTIVE ]

{ BEFORE | AFTER }

{ DELETE | INSERT | UPDATE }

[ POSITION номер ]

AS

[<объявление локальных переменных>]

BEGIN

<оператор>

END

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

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

ACTIVE | INACTIVE – указывает, активен триггер или нет. Можно определить триггер «про запас», установив для него INACTIVE. По умолчанию действует ACTIVE.

BEFORE | AFTER – указывает, будет выполнятьсятриггер до (BEFORE) или после (AFTER) запоминания изменений в БД.

DELETE | INSERT | UPDATE – указывает операцию над таблицей БД, при выполнении которой срабатывает триггер.

POSITION номер – указывает каким по счету будет выполняться триггер в случае наличия группы триггеров, обладающих одинаковыми характеристиками. Триггеры с меньшими номерами выполняются раньше

Пример.

Обеспечение каскадных воздействий):



CREATE TRIGGER AD_TOVARY FOR TOVARY

ACTIVE

AFTER DELETE

POSITION 1

AS

BEGIN

DELETE FROM RASHOD

WHERE RASHOD.TOVAR = TOVARY.TOVAR;

END

3.6.3.Значения OLD и NEW


Значение OLD.имя_столбца позволяет обратиться к состоянию столбца, имевшему место до внесения возможных изменений, а значение NEW.имя_столбца – к состоянию столбца, имевшему место после внесения возможных изменений.

Пример:

CREATE TRIGGER BU_TOVARY FOR TOVARY

ACTIVE

BEFORE UPDATE

AS

BEGIN

IF ( OLD.TOVAR <> NEW.TOVAR ) THEN

UPDATE RASHOD

SET TOVAR = NEW.TOVAR

WHERE TOVAR = OLD.TOVAR;

END

3.6.4.Изменение существующего триггера:


ALTER TRIGGER ИмяТриггера FOR ИмяТаблицы

[ ACTIVE | INACTIVE ]

{ BEFORE | AFTER }

{ DELETE | INSERT | UPDATE }

[ POSITION номер ]

AS <тело триггера>

3.6.5.Удаление триггера:


DROP TRIGGER ИмяТриггера

3.6.6.Обеспечение каскадных воздействий с помощью триггеров


Если между двумя или более таблицами БД установлены отношения ссылочной целостности («один ко многим», «один к одному»), при изменении столбца связи в родительской таблице должно быть изменено значение столбца связи у записей соответствующих дочерних таблиц. Такое воздействие носит название каскадного обновления.

Триггер, реализующий каскадное обновление в дочерней таблице, будет в числе прочих содержать оператор:



IF (OLD.ПолеСвязиРодителя <> NEW. ПолеСвязиРодителя) THEN

UPDATE Дочерняя.Таблица

SET ПолеСвязиДочернейТаблицы = NEW.ПолесвязиРодителя

WHERE ПолеСвязиДочернейТаблицы = OLD.ПолеСвязиРодителя ;
Если в родительской таблице удалена запись, должны быть удалены все связанные с ней записи в дочерней таблице. Такое воздействие на дочернюю таблицу носит название каскадного удаления.

Триггер, реализующий каскадное удаление в дочерней таблицы, будет содержать оператор:



DELETE FROM ДочерняяТаблица

WHERE ПолеСвязиДочернейТаблицы = ПолеСвязиРодителя ;
Примеры.

CREATE TRIGGER BU_TOVARY FOR TOVARY

ACTIVE

BEFORE UPDATE

AS

BEGIN

IF (OLD.TOVAR <> NEW.TOVAR) THEN

UPDATE RASHOD

SET TOVAR = NEW.TOVAR

WHERE TOVAR = OLD.TOVAR;

END

---------------------------------------

CREATE TRIGGER AD_TOVARY FOR TOVARY

ACTIVE

AFTER DELETE

AS

BEGIN

DELETE FROM RASHOD

WHERE RASHOD.TOVAR = TOVARY.TOVAR;

END

3.6.7.Использование триггеров для реализации бизнес-правил


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

Пример.

Реализуем простейшее правило формирования уникального значения столбца. Пусть столбец N_RASH в таблице RASHOD должен содержать уникальное значение. Для этой цели определим генератор RASHOD_N_RASH и установим его начальное значение 20.

CREATE GENERATO RASHOD_N_RASH

SET GENERATOR RASHOD_N_RASH TO 20 ;


При добавлении новой записи будем присваивать столбцу N_RASH уникальное значение, полученное при помощи генератора:

CREATE TRIGGER BI_RASHOD_GEN FOR RASHOD

ACTIVE

BEFORE INSERT



BEGIN

NEW.N_RASH = GEN_ID(RASHOD_N_RASH,1);

END

1   ...   9   10   11   12   13   14   15   16   ...   20


База данных защищена авторским правом ©bezogr.ru 2016
обратиться к администрации

    Главная страница