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

Тема 2.10 Работа с триггерами

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

По событию изменения таблицы БД триггеры различаются на вызываемые при

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

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

  • удалении записи.

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

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

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

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

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

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

При откате транзакции отменяются также и все изменения, внесенные в базу данных триггерами.

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

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

CREATE TRIGGER <имя триггера> FOR <имя таблицы>

[ACTIVE/INACTIVE]

{BEFORE/AFTER}

{DELETE/INSERT/UPDATE}

[POSITION номер]

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

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

Структура тела триггера:

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

BEGIN

<оператор>

[<оператор>…]

END

В заголовке триггера:

  • [ACTIVE/INACTIVE]указывает, активен триггер или нет (по умолчанию ACTIVE) В процессе работы триггер можно переопределить как активный или неактивный.

  • {BEFORE/AFTER}указывает, будет выполняться триггер до (BEFORE) или после (AFTER) запоминания изменений в базе данных.

  • {DELETE/INSERT/UPDATE}указывает операцию над таблицей базы данных, при выполнении которой срабатывает триггер.

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

Пример:

CREATE TRIGGER A FOR RASHOD

BEFORE INSERT POSITION 1 …

Значение 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

В этом примере триггер вносит соответствующие изменения в таблицу RASHOD, если в записи таблицы TOVARY изменилось значение столбца TOVAR.

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

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

Если в родительской таблице удалена запись, должны быть удалены все связанные с ней записи дочерней таблицы – Такое воздействие на дочернюю таблицу называется каскадное удаление.

Ограничение ссылочной целостности таблиц по внешнему ключу приводит к блокировке изменения и удаления записи в родительской таблице:

Для реализации автоматического выполнения каскадных обновлений и изменений необходимо:

  1. в определении БД удалить ссылочные целостности, блокирующие такие изменения;

  2. определить сами триггеры для родительской таблицы.

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

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

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

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

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

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

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

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

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