Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие ТБД.doc
Скачиваний:
25
Добавлен:
04.09.2019
Размер:
1.92 Mб
Скачать

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