- •Содержание
- •6.1. Вступление.
- •6.2. Определитель null.
- •6.3. Целостность сущностей.
- •6.4. Ссылочная целостность.
- •6.5. Корпоративные ограничения целостности.
- •6.6. Хранимые процедуры в субд InterBase.
- •6.6.1. Понятие хранимой процедуры.
- •6.6.2. Создание хранимой процедуры.
- •6.6.3. Алгоритмический язык хранимых процедур.
- •Into переменная [, переменная...]
- •6.7. Средства субд InterBase, обеспечивающие приемлимые значения целостность данных.
- •6.7.1. Ограничения на уровне домена.
- •6.7.2. Добавление, изменение и удаление записей.
- •6.7.3. Определение значения поля первичного ключа с помощью генератора.
- •6.7.3. Обеспечение целостности сущности и ссылочной целостность на этапе создания таблицы.
- •6.7.4. Использование триггеров для обеспечения ссылочной целостности.
- •6.7.5. Поддержка целостности данных с помощью хранимых процедур.
- •Контрольные вопросы:
6.7.5. Поддержка целостности данных с помощью хранимых процедур.
Ранее отмечалось, что хранимые процедуры являются одним из способов поддержки целостности данных на стороне сервера, а не клиента. В логике хранимой процедуры можно проверять правила целостности и генерировать ошибку, если клиент запрашивает выполнение запрещенной операции. Например, ниже показан текст хранимой процедуры, выполняющей операции по определению автора книги в отношении Books, которая содержит все необходимые проверки допустимости этой операции. Если операция недопустима, после генерации соответствующей исключительной ситуации выполнение процедуры прекращается.
CREATE EXCEPTION AuthorNotFound "Автор не найден.";
CREATE PROCEDURE FindAuthor
(AuthorCode INTEGER,
BookCode INTEGER)
AS
DECLARE VARIABLE FindAuthorCode INTEGER;
/* В переменную помещаем результат поиска кода автора в таблице BookAuthors./*
BEGIN
SELECT ba.Code
FROM BookAuthors ba
WHERE ba.Code = AuthorCode
INTO :FindAuthorCode;
/* В переменную помещаем результат поиска кода автора в таблице BookAuthors./*
IF (FindAuthorCode IS NULL) THEN
/* В таблице BookAuthors заданного кода автора книги не обнаружено./*
BEGIN
EXCEPTION AuthorNotFound;
SUSPEND;
END
ELSE
/* В таблице BookAuthors обнаружен заданный код автора книги./*
BEGIN
UPDATE Books
SET AuthorCode = FindAuthorCode
WHERE Code = :BookCode
SUSPEND;
END
END
Обратите внимание на еще одну функцию языка описания данных сервера InterBase — поддержку исключительных ситуации (EXCEPTION). Они представляют собой поименованные сообщения об ошибках, генерируемые в хранимой процедуре при обнаружении ошибочной ситуации. При возникновении исключительной ситуации в вызывающее приложение возвращается сообщение об ошибке и выполнение хранимой процедуры завершается. Однако исключительную ситуацию можно обработать и внутри хранимой процедуры, после чего продолжить ее выполнение.
Исключительные ситуации определяются с помощью оператора CREATE EXCEPTION, как показано в листинге. Для генерации исключительной ситуации внутри хранимой процедуры используется следующий синтаксис:
EXCEPTION ExceptionName;
Если необходимо выполнить несколько проверок, тогда все требуемые проверки должны выполняться внутри данной хранимой процедуры. В результате, любое использующее эту хранимую процедуру клиентское приложение будет придерживаться одних и тех же ограничений целостности данных.
Контрольные вопросы:
На что указывает определитель NULL и как его понимать?
Чем отличается нулевое численное значение или заполненная пробелами текстовая строка от определителя NULL.
Почему в базовом отношении ни один атрибут первичного ключа не может содержать отсутствующих значений, обозначаемых определителем NULL?
Сформулируйте ограничение целостности, которое касается внешних ключей.
Что такое корпоративные ограничения целостности?
Какие разновидности хранимых процедур Вы знаете?
Каковы особенности хранимых процедур выбора?
Каковы особенности хранимых процедур действия?
Какие преимущества хранимых процедур Вы знаете?
Для чего служит аппарат генераторов в Interbase?
Что такое триггер? Каковы его особенности?
Какие события изменения таблицы базы данных могут вызвать выполнение тела триггера?
Какие преимущества использования триггеров Вы знаете?
Как и какие каскадные воздействия обеспечиваются с помощью триггеров?