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

Синтаксис

CREATE EXCEPTION name "<message>";

Аргумент

Описание

name

Имя, которое ассоциировано с сообщением исключительной ситуации. Должно быть уникальным среди имен исключительных ситуаций в базе данных.

"<message>"

Строка, заключенная в кавычки, содержащая буквенно-цифровые символы и знаки пунктуации. Максимальная длина: 78 символов.

Примеры

Следующая инструкция создает UNKNOWN_EMP_ID исключительную ситуацию:

CREATE EXCEPTION UNKNOWN_EMP_ID "Invalid employee number or project id.";

Следующий фрагмент из сохраненной процедуры поднимает, предварительно установленную исключительную ситуацию, когда SQLCODE принимает значение -530, которое является нарушением ограничения FOREIGN KEY:

...

WHEN SQLCODE -530 DO

EXCEPTION UNKNOWN_EMP_ID;

...

Вызываем Interactive SQL, пятая кнопка справа. Пишем запрос:

CREATE EXCEPTION EX_NOMBER1 “Ошибка”;

commit;

Нажимаем выполнить.

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

При этом запрос выполнится, и окно запросов очиститься.

Создадим еще несколько исключений аналогично:

CREATE EXCEPTION EX_NOMBER2 “Неверно введены данные”;

commit;

CREATE EXCEPTION EX_NOMBER2 “ОК! Все работает правильно”;

commit;

СОДЕРЖАНИЕ И ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

  1. Изучить теоретические сведения.

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

  3. Проверить работу всего проекта.

  4. Продемонстрировать преподавателю работу разработанного образца проекта.

  5. Получить от преподавателя индивидуальное задание и создать проект (по аналогии) для выполнения индивидуального задания.

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

Вопросы выходного контроля:

  1. Расскажите, как установить и настроить Inter Base.

  2. Дайте определение понятию индекс.

  3. Расскажите, как создать индекс и для чего они используются

  4. Напишите синтаксис создания индексов.

  5. Дайте определение понятию исключение

  6. Расскажите, как создать исключение, и для чего они нужны.

  7. Напишите синтаксис создания исключения.

Лабораторная работа №14

Тема: Создание и модификация триггеров в СУБД.

Цель работы: Научится создавать и модифицировать триггеры в СУБД на примере Inter Base.

Время работы: 2 учебных часа.

Правила по ТБ: Общие.

Оборудование рабочего места: Практикум, ПК.

Программное обеспечение: Windows, MS Office, InterBase.

Вопросы входного контроля:

  1. Расскажите, как создать таблицу

  2. Дайте определение понятию триггер.

  3. Дайте определение понятию индекс.

  4. Расскажите, как создать индекс и для чего они используются

  5. Дайте определение понятию исключение

  6. Расскажите, как создать исключение, и для чего они нужны.

КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

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

В Interbase нет такого типа как счетчик или autoincrement, выход из этой ситуации обеспечивается созданием, так называемого генератора!

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

Вызываем Interactive SQL, пятая кнопка справа. Пишем запрос:

CREATE GENERATOR GEN_CAR;

Нажимаем выполнить.

Мы создали генератор GEN_CAR. Теперь нам надо установить начальное значение генератора, делается это следующим образом:

SET GENERATOR GEN_CAR TO 0;

Нажимаем выполнить.

При этом запрос выполнится, и окно запросов очиститься.

Остальные генераторы создаются аналогично:

CREATE GENERATOR GEN_CLIENT;

commit;

SET GENERATOR GEN_CLIENT TO 0;

commit;

CREATE GENERATOR GEN_GRAFWORK;

commit;

SET GENERATOR GEN_GRAFWORK TO 0;

commit;

CREATE GENERATOR GEN_OPERATION;

commit;

SET GENERATOR GEN_OPERATION TO 0;

commit;

CREATE GENERATOR GEN_PERSONAL;

commit;

SET GENERATOR GEN_PERSONAL TO 0;

commit;

CREATE GENERATOR GEN_SERVICE;

commit;

SET GENERATOR GEN_SERVICE TO 0;

commit;

CREATE GENERATOR GEN_TSERVICE;

commit;

SET GENERATOR GEN_TSERVICE TO 0;

commit;

Теперь жмите CTRL+E, у Вас должно получится вот так (рисунок 14.1):

Рисунок 14.1 – Созданные генераторы

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

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

Пишем запрос:

SET TERM !!;

CREATE TRIGGER "BEF_INS_CAR" FOR "CAR"

ACTIVE BEFORE INSERT

AS

BEGIN

NEW.CARID = GEN_ID(GEN_CAR,1);

END!!

SET TERM ;!!

commit;

Выполняем запрос! Опаньки, наш генератор теперь введен в работу :)

Конструкция SET TERM задает новый разделитель операторов. Если ее не использовать, то получится, что у Вас и после NEW.CARID = GEN_ID(GEN_CAR,1); стоит точка с запятой и после END тоже стоит точка запятой, а Interbase это не нравится, почему я так и не понял, но она без конструкции SET TERM отказывается создавать триггер.

Также хочу обратить твое внимание на то, что в строках:

SET TERM !!;

SET TERM ;!!

после TERM необходимо поставить пробел, а между «!!» и «;» ставить пробел необязательно! С этой проблемой я столкнулся при переходе на версию 7.5, в IB6 скрипты работали без разделения пробелом «TERM» и «!!;».

Рассмотрим поподробней, что же мы накодили:

CREATE TRIGGER – говорит, что мы хотим создать триггер (правило), далее указываем название триггера и для какой таблицы он будет предназначен (FOR "CAR"). Предложение ACTIVE BEFORE INSERT – указывает, когда триггер должен выполняться, в данном случае, каждый раз перед созданием новой записи. Слово AS – зарезервированное, открывает тело триггера. Тело триггера всегда (даже если триггер содержит единственный оператор – как в нашем случае) должно ограничиваться парой ключевых слов BEGINEND. В шестой строке расположен оператор, в котором новому значению (слово NEW) поля CARID присваивается значение, полученное от встроенной функции GEN_ID. Двумя параметрами обращения к этой функции указывается имя генератора и то значение, на которое должно увеличиться текущее значение генератора («шаг» генератора).

Создаем остальные триггеры:

SET TERM !!;

CREATE TRIGGER "BEF_INS_CLIENT" FOR "CLIENT"

ACTIVE BEFORE INSERT

AS

BEGIN

NEW.CLIENTID = GEN_ID(GEN_CLIENT,1);

END!!

SET TERM ;!!

commit;

SET TERM !!;

CREATE TRIGGER "BEF_INS_GRAFWORK" FOR "GRAFWORK"

ACTIVE BEFORE INSERT

AS

BEGIN

NEW.WORKID = GEN_ID(GEN_GRAFWORK,1);

NEW.DATA = 'TODAY';

END!!

SET TERM ;!!

commit;

SET TERM !!;

CREATE TRIGGER "BEF_INS_OPERATION" FOR "OPERATION"

ACTIVE BEFORE INSERT

AS

BEGIN

NEW.OPERID = GEN_ID(GEN_OPERATION,1);

NEW.DATA = 'TODAY';

END!!

SET TERM ;!!

commit;

SET TERM !!;

CREATE TRIGGER "BEF_INS_PERSONAL" FOR "PERSONAL"

ACTIVE BEFORE INSERT

AS

BEGIN

NEW.PERSONALID = GEN_ID(GEN_PERSONAL,1);

END!!

SET TERM ;!!

commit;

SET TERM !!;

CREATE TRIGGER "BEF_INS_SERVICE" FOR "SERVICE"

ACTIVE BEFORE INSERT

AS

BEGIN

NEW.SERVICEID = GEN_ID(GEN_SERVICE,1);

END!!

SET TERM ;!!

commit;

SET TERM !!;

CREATE TRIGGER "BEF_INS_TSERVICE" FOR "TSERVICE"

ACTIVE BEFORE INSERT

AS

BEGIN

NEW.TSERVICEID = GEN_ID(GEN_TSERVICE,1);

END!!

SET TERM ;!!

commit;

Выполнем запрос. Теперь все генераторы связаны со своими таблицами.

В теории баз данных есть такая фишка: каскадное удаление данных, то есть при удалении строки из родительской таблицы происходит автоматическое удаление данных из дочерних таблиц. В нашем случае, например, Вам захочется удалить какого-нибудь сотрудника из таблицы «PERSONAL», но в «GRAFWORK» есть информация о графике работы этого сотрудника и в «OPERATION» находятся все операции совершенные им. То есть если сотрудник исчезнет, в связанных таблицах данные «повиснут», и Ваша база будет засорена.

Можно написать триггер, в котором описать все необходимые действия для организации каскадного удаления. Заходим в Interactive SQL и пишем:

SET TERM !!;

CREATE TRIGGER "BEF_DEL_PERSONAL" FOR "PERSONAL"

ACTIVE BEFORE DELETE

AS

BEGIN

DELETE FROM "GRAFWORK"

WHERE GRAFWORK.PERSONALKOD=PERSONAL.PERSONALID;

DELETE FROM "OPERATION"

WHERE OPERATION.PERSONALKOD=PERSONAL.PERSONALID;

END!!

SET TERM ;!!

commit;

Жмите CTRL+E, получите триггер.

Мы создали триггер "BEF_DEL_PERSONAL" для таблицы "PERSONAL", который будет срабатывать перед удаление строки (ACTIVE BEFORE DELETE), выполняя удаление из таблицы «GRAFWORK» и «OPERATION» (DELETE FROM ...).

Теперь сделайте еще два триггера с помощью скрипта:

SET TERM !!;

CREATE TRIGGER "BEF_DEL_OPERATION" FOR "OPERATION"

ACTIVE BEFORE DELETE

AS

BEGIN

DELETE FROM "TSERVICE"

WHERE TSERVICE.OPERKOD=OPERATION.OPERID;

END!!

SET TERM ;!!

commit;

SET TERM !!;

CREATE TRIGGER "BEF_DEL_CLIENT" FOR "CLIENT"

ACTIVE BEFORE DELETE

AS

BEGIN

DELETE FROM "CAR" WHERE CAR.CLIENTKOD=CLIENT.CLIENTID;

DELETE FROM "OPERATION"

WHERE OPERATION.CLIENTKOD=CLIENT.CLIENTID;

END!!

SET TERM ;!!

commit;

Выполните скрип, у Вас получатся вот такие триггеры (рисунок 14.2):

Рисунок 14.2 – Созданные триггеры

Использование базы данных

Чтобы от нашей базы была хоть какая-то польза необходимо внести в нее информацию.

Можно, конечно, это сделать с помощью интерфейса IBConsole, но я опять-таки рекомендую использовать Interactive SQL. Используйте конструкцию INSERT. Можешь вносить свои данные и изменять старые. Удалять строки из таблиц, проверяя, как действует каскадное удаление.

СОДЕРЖАНИЕ И ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

  1. Изучить теоретические сведения.

  2. К созданной базе данных в предыдущей лабораторной работе создать триггеры как рассказано выше, следуя все описанным шагам.

  3. Проверить работу всего проекта.

  4. Продемонстрировать преподавателю работу разработанного образца проекта.

  5. Получить от преподавателя индивидуальное задание и создать проект (по аналогии) для выполнения индивидуального задания.

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

Вопросы выходного контроля:

    1. Дайте определение понятию индекс.

    2. Напишите синтаксис создания индексов.

    3. Дайте определение понятию исключение

    4. Напишите синтаксис создания исключения.

    5. Дайте определение понятию триггер.

    6. Расскажите, для чего используются триггеры.

    7. Напишите синтаксис создания триггера.