Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы БД.doc
Скачиваний:
149
Добавлен:
18.05.2015
Размер:
5.33 Mб
Скачать
  1. Лабораторная работа №5. Триггеры, генераторы, исключения

Цель работы

Изучить используемые в Firebird триггеры, генераторы и исключения. Получить навыки работы с триггерами, генераторами и исключениями с помощью команд SQL и с помощью программы "IBExpert".

Исходные данные

Студент получает индивидуальный вариант исходных данных с кратким описанием предметной области, который используется при выполнении всех лабораторных работ. При этом каждая очередная лабораторная работа является продолжением выполненной ранее и поэтому они должны обязательно выполняться последовательно.

Используемые программы

Все операции выполняются с помощью приложения "IBExpert". Отчет создается в редакторе " Microsoft Word".

Теоретические сведения

Генераторы (Generators)

Генераторы используются для генерации уникальных номеров, используемых в ключевых полях. То есть они реализуют те же функциональные возможности в таблицах Firebird, что и поля с автоматическим приращением в других СУБД. Можно указать, чтобы числа генерировались, начиная с заданного начального значения.

Пример создания генератора:

CREATE GENERATOR MyGenerator;

SET GENERATOR MyGenerator TO 1000;

Генераторы непосредственно не привязываются к какому-либо полю. Они просто позволяют генерировать уникальные числа. Для этого используется функция Gen_ID(), встроенная в Firebird, которая генерирует целочисленные значения. Она берет генератор в качестве первого параметра и значение шага в качестве второго. Обычно приращение равно 1.

Обращаться к генератору можно только через функцию Gen_ID().

Бизнес-правила

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

  • клиентам не разрешается размещать заказы на сумму, превышающую их лимит кредита;

  • сведения о выполненных заказах хранятся в течение шести месяцев, а за-тем удаляются;

  • нельзя выдавать читателю новых книг, пока он не вернет взятых ранее;

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

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

Такие правила называются бизнес-правилами. В первом стандарте SQL считалось, что эти правила выходят за рамки ответственности СУБД и за их реализацию отвечает прикладная программа, осуществляющая доступ к базе данных. Впервые в 1986 году в СУБД Sybase было введено понятие триггер, что позволило включить реализацию бизнес-правил в базу данных.

Триггеры (Triggers)

С любым событием, вызывающим изменение содержимого таблицы, можно связать сопутствующее действие (триггер), которое СУБД должна выполнять при каждом возникновении события. Триггер – это группа операторов языка SQL, которые автоматически выполняется при вставке, модификации или удалении записи.

В СУБД можно создавать триггеры, работающие при следующих шести условиях:

  • до вставки записи (BEFORE INSERT);

  • после вставки записи (AFTER INSERT);

  • до удаления записи (BEFORE DELETE);

  • после удаления записи (AFTER DELETE);

  • до модификации записи (BEFORE UPDATE);

  • после модификации записи (AFTER UPDATE).

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

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

Синтаксис оператора создания триггера:

CREATE TRIGGER <Имя>

FOR { <базовая таблица> | <имя представления>

[ACTIVE | INACTIVE]

{BEFORE | AFTER} <операция> [OR <операция> [OR <операция>]]

[POSITION приоритет триггера]

AS <тело триггера> [разделитель];

где

<операция> = {INSERT | UPDATE | DELETE}

Тело триггера определяется следующим образом:

<тело триггера> = [<список переменных>] <блок операторов>

<список переменных> =

DECLARE [VARIABLE] <переменная> <тип данных>;

[DECLARE [VARIABLE] <переменная> <тип данных>; ...]

<блок операторов> =

BEGIN

<составной оператор> [<составной оператор>...]

END

<составной оператор> = <блок операторов> | <оператор>;

Параметры, входящие в этот оператор, пояснены в табл. 1.

Таблица 1

Параметр

Описание

Имя

Уникальное название триггера.

Таблица

Название таблицы или просмотра, для которых создается триггер

ACTIVE | INACTIVE

Указывает будет ли работать триггер

BEFORE | AFTER

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

INSERT | UPDATE | DELETE

Одно из событий, на которые будет срабатывать триггер

POSITION Номер

Определяет порядок срабатывания триггера, когда имеется несколько триггеров, реагирующих на одно и то же событие. Номер – целое число между 0 и 32767

DECLARE [VARIABLE] Переменная <тип данных>

Описание локальной переменной, которую можно будет использовать только в этом триггере

Оператор

Любой одиночный оператор языка хранимых процедур и триггеров Firebird

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

Пример генератора и триггера:

CREATE GENERATOR EMP_NO_GEN;

CREATE TRIGGER SET_EMP_NO FOR EMPLOYEE

ACTIVE BEFORE INSERT POSITION 0

AS

BEGIN

IF (NEW.EMP_NO IS NULL) THEN

NEW.EMP_NO = GEN_ID(EMP_NO_GEN, 1);

END;