- •1. Условия достоверности, хранимые процедуры, триггеры
- •Хранимые процедуры
- •Условия достоверности ввода данных на уровне поля таблицы
- •Условия достоверности ввода данных на уровне записей
- •Триггеры
- •Использование триггеров и хранимых процедур
- •Определение значения поля при добавлении новой записи
- •Проверка удовлетворения введенных значений заданному условию
Определение значения поля при добавлении новой записи
Рассмотрим следующий пример. Чтобы создать для любой таблицы БД первичный ключ, в таблицу добавляется поле, содержащее код клиента. Информация в данное поле должна заноситься программно, чтобы не нарушалась уникальность ключа. Для формирования и записи в таблицу кода клиента при добавлении новой записи создадим хранимую процедуру mylastid:
Создать в базе данных дополнительную таблицу lastid со следующей структурой:
-
Имя поля
Тип поля
lastid
Integer (4)
alias
Character (20)
Первое поле предназначено для ввода наименования таблицы, второе — для указания последнего введенного числового кода в данную таблицу. При вызове хранимой процедуры значение второго поля указанной таблицы увеличивается на единицу, и процедура возвращает новое значение кода. Т.о., таблица хранит последнее значение идентификатора таблицы, если для формирования его значения по умолчанию используется хранимая процедура mylastid.
Создать хранимую процедуру (функцию) mylastid :
FUNCTION mylastid
PARAMETER myalias
IF TYPE (“myalias”)#”C” .OR. EMPTY(“myalias”)
myalias=ALIAS()
ENDIF
SELECT lastid
LOCATE FOR lastid.alias==myalias
IF FOUND()=.T.
REPLACE lastid.lastid WITH lastid.lastid+1
ELSE
APPEND BLANK
REPLACE lastid. alias WITH myalias, lastid.lastid WITH 1
ENDIF
SELECT &myalias
RETURN lastid.lastid
Функция mylastid сохраняется как хранимая процедура. Вызов функции с фактическим параметром – именем таблицы, в которую будет добавляться новая строка, помещается в поле Default value (Значение по умолчанию) конструктора таблицы для соответствующего идентификатора (поля таблицы, являющегося первичным индексом).
Практическое задание 2
Обеспечить в базе данных контроль значений первичных индексов для таблиц, имеющих простой уникальный первичный индекс, посредством формирования значений первичных индексов этих таблиц по умолчанию с использованием хранимой процедуры (функции mylastid).
Проверка удовлетворения введенных значений заданному условию
В данном примере определим условие проверки достоверности ввода данных для таблицы ordsaied, содержащей информацию о заказе. Например, при формировании накладной отпуска товара в кредит необходимо сравнивать итоговую сумму заказываемых товаров с максимально допустимым кредитом для данного клиента, содержащимся в таблице customer. Проверку будем осуществлять при вводе каждой позиции заказа.
Откройте окно проекта sales.
Выберите в окне проекта таблицу ordsaied и нажмите кнопку Modify (Модифицировать).
Для определения свойств таблицы перейдите на вкладку Table (Таблица).
В поле ввода Rule (Условие) области Record validation (Проверка правильности ввода записи) задайте вызов функции checkMaxCredit о, которая сравнивает итоговую сумму заказа с максимально допустимым кредитом клиента.
В поле Message (Сообщение) области Record validation введите текст сообщения (рис.4) "Вы превысили допустимую сумму кредита клиента".
Рис.4 Определение условия достоверности данных
Определим функцию CheckMaxCredit как свойство базы данных, поэтому создадим ее в виде хранимой процедуры.
Для создания хранимой процедуры CheckMaxCredit в окне редактирования хранимых процедур, которое содержит ранее созданные программы, введите следующий текст:
procedure CheckMaxCredit
nCdOrder=Ordsaled.icdOrder && номер текущего заказа
* вычисляем сумму всех введенных позиций заказа
SELECT SUM(Ordsaied.nQuant*Ordsaled.nUnitPrice);
FROM Ordsalem, Ordsaied;
WHERE Ordsalem.icdOrder = Ordsaied.icdOrder;
AND Ordsaied.icdOrder=nCdOrder;
INTO ARRAY nSum
* определяем максимальный кредит клиента из таблицы Customer
SELECT Customer
SEEK Ordsalem.icdCustomer
* если запись о данном покупателе в таблице Customer есть, возвращаем
* результат сравнения суммы заказа с максимальным кредитом
IF FOUND( )
RETURN nSum(l) < CUSTOMER.yCreditLimit
ELSE
RETURN .F.
ENDIF
RETURN
Контрольные вопросы
Что такое ограничения целостности?
В чем важность заданий ограничений целостности?
Какие виды ограничений целостности существуют? Приведите примеры ограничений целостности каждого вида.
Какие способы задания ограничений целостности существуют?
Для чего используются хранимые процедуры?