- •Раздел 2 проектирование серверной части приложения баз данных
- •Тема 2.1 sql-сервер InterBase и его основные компоненты
- •Тема 2.2 Физическая организация базы данных InterBase.
- •Тема 2.3 Создание базы данных.
- •Тема 2.4 Домены
- •Создание домена.
- •Тема 2.5 Создание таблиц
- •Определение ключей и ссылочных целостностей.
- •Тема 2.6 Работа с индексами.
- •Тема 2.7 Добавление, изменение, удаление записей
- •Добавление записей
- •Изменение записей.
- •Тема 2.8 Работа с просмотрами view.
- •Тема 2.9 Работа с хранимыми процедурами.
- •Изменение и удаление хранимых процедур
- •Алгоритмический язык хранимых процедур.
- •Тема 2.10 Работа с триггерами
- •Создание триггеров.
- •Тема 2.11 Использование генераторов.
Тема 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.
Обеспечение каскадных воздействий.
Если между двумя или более таблицами установлено отношение ссылочной целостности (отношение «один-ко-многим» или «один-к-одному»), при изменении столбца связи в родительской таблице должно быть изменено значение столбца связи у записей соответствующих дочерних таблиц. Такое воздействие на дочернюю таблицу называется каскадным обновлением.
Если в родительской таблице удалена запись, должны быть удалены все связанные с ней записи дочерней таблицы – Такое воздействие на дочернюю таблицу называется каскадное удаление.
Ограничение ссылочной целостности таблиц по внешнему ключу приводит к блокировке изменения и удаления записи в родительской таблице:
Для реализации автоматического выполнения каскадных обновлений и изменений необходимо:
в определении БД удалить ссылочные целостности, блокирующие такие изменения;
определить сами триггеры для родительской таблицы.
Триггер, реализующий каскадное обновление в дочерней таблице, будет содержать оператор:
IF (OLD.ПолеСвязиРодителя<>NEW. ПолеСвязиРодителя)THEN
UPDATE ДочерняяТаблица
SET ПолеСвязиДочернейТаблицы = NEW. ПолеСвязиРодителя
WHERE ПолеСвязиДочернейТаблицы = OLD. ПолеСвязиРодителя;
Триггер, реализующий каскадное удаление в дочерней таблице, содержит оператор:
DELETE FROM ДочерняяТаблица
WHERE ПолеСвязиДочернейТаблицы = ПолеСвязиРодителя;
При работе с базой данных необходимо ведение журнала изменений. Журнал изменений в базе данных представляет собой таблицу базы данных, в которой фиксируются действия над всей базой данных или отдельными её таблицами. В многопользовательских системах ведение такого журнала позволяет определить источник недостоверных или искаженных данных. Для ведения в базе данных журнала изменений нужно определить таблицу, в которой записывается дата изменений, операция, старые и новые значения необходимых реквизитов. Изменения фиксируются с помощью соответствующих триггеров. Триггеры могут использоваться для реализации бизнес-правил – это установка с помощью генераторов уникальных значений индексных полей, накапливание статистики в других таблицах и т.д.