Установление связей между таблицами
Для создания связей в WISQL используются инструкции вида PRIMARY KEY (NG) – создание основного ключа по полю NG; FOREIGN KEY (NG) REFERENCES GRUPPA (NG) – создание внешнего ключа NG с подключением к основному ключу NG таблицы GRUPPA.
Структура таблиц и связей разработанной РБД представлена на рис. 14.15. Связи и таблицы в РБД по возможности сохранены для осуществления переноса и конвертирования информации из ранее описанной БД.
Создание хранимых процедур. Хранимая процедура в СУБД InterBase может применяться как в алгоритме приложения, так и, наряду с триггерами, в собственно базах данных для каскадного удаления и обновления.
Клиентской части нужно передать параметры в хранимую процедуру. После окончания работы хранимая процедура передает результаты клиентскому приложению. Такой подход позволяет также снизить требования к производительности компьютера пользователя, работающего с РБД.
Приведем пример хранимой процедуры, осуществляющей удаление ключевых записей из таблицы Kafedra:
ALTER PROCEDURE KAFEDRA_DEL (DKKAF INTEGER)
AS
declare variable dsh_spec integer;
declare variable dng varchar(6);
declare variable dnzk varchar(10);
declare variable dkprikaz integer;
declare variable dkprep integer;
BEGIN
for select sh_spec from specialnost
where kkaf=:dkkaf
into :dsh_spec
do
begin
Рис. 14.15. Схема связей таблиц БД "Учебный процесс"
for select ng from gruppa
where gruppa.sh_spec=:dsh_spec
into :dng
do
begin
for select nzk from student
where student.ng=:dng
into :dnzk
do
begin
delete from ipp where ipp.nzk=:dnzk;
delete from uspevaem where uspevaem.nzk=:dnzk;
delete from atestacia where atestacia.nzk=:dnzk;
delete from oplata where oplata.nzk=:dnzk;
delete from obshegit where obshegit.nzk=:dnzk;
for select kprikaz from prikaz
where prikaz.nzk=:dnzk
into :dkprikaz
do delete from vid_prikaz where vidjDrikaz.kprik-:dkprikaz;
delete from prikaz where prikaz.nzk=:dnzk;
end
delete from student where student.ng=:dng;
delete from izuchenie where izuchenie.ng=:dng;
delete from gruppa where gruppa.ng=:dng;
end
delete from specialnost where sh_spec=:dsh_spec;
end
for select kprep from prepod where kkaf=:dkkaf
into :dkprep
do begin
delete from izuchenie where kprep=:dkprep;
delete from uspevaem where kprep=:dkprep;
delete from atestacia where kprep=:dkprep;
end
delete from prepod where kkaf=:dkkaf;
delete from laba where laba.kkaf=:dkkaf;
delete from kafedra where kkaf=:dkkaf;
suspend;
END
Данная процедура KAFEDRADEL в качестве параметра получает номер кафедры DKKAF, после чего сначала осуществляет удаление записей в подчиненных таблицах и лишь затем ключевой записи в таблице KAFEDRA.
Многие подчиненные таблицы сами имеют подчиненные таблицы. Таким образом, перед удалением данных в них необходимо осуществить удаление данных в подчиненных им таблицах и лишь потом – в родительских таблицах. Выйти из сложившегося положения позволяет поддерживаемая в InterBase вложенность процедур языка SQL. Благодаря этому существует возможность реализовать достаточно сложную процедуру каскадного удаления, содержащую в себе до 16 вложений при размере подобной процедуру не более 48 кбайт.
В БД "Учебный процесс" имеется несколько хранимых процедур, которые выполняют следующие работы:
- • GruppaDel – каскадное удаление в таблице Gruppa и связанных с ней таблицах;
- • KafedraDel – каскадное удаление в таблице Kafedra и связанных с ней таблицах;
- • Predmet_Del – каскадное удаление в таблице Predmet и связанных с ней таблицах;
- • Predpr Del – каскадное удаление в таблице Predpr и связанных с ней таблицах.
- • PrepodDel – каскадное удаление в таблице Prepod и связанных с ней таблицах;
- • Prikaz_Del – каскадное удаление в таблице Prikaz и связанных с ней таблицах;
- • SpecialnostDel – каскадное удаление в таблице Specialnost и связанных с ней таблицах;
- • Student Del – каскадное удаление в таблице Student и связанных с ней таблицах.
Заполнение (загрузка таблиц данными из существующей БД "Учебный процесс"), как и в централизованной БД, возможно либо прямо в таблицу, либо в формы. Состав форм описан в интерфейсе пользователя.
В отличие от централизованной БД в данной БД часть данных заполняется автоматически через генераторы.
Создание системы генераторов. В явном виде InterBase не поддерживает полей типа "автонумерация". Вместо этою в InterBase существует механизм, называемый "генераторами". Генератор – некая переменная, значение которой может быть получено и увеличено на некоторое значение при помощи встроенной функции GEN_ID.
Обычно генераторы используют в триггерах, при этом текст триггера может быть следующим:
CREATE TRIGGER TI_CLIENTS FOR CLIENTS
ACTIVE BEFORE
INSERT POSITION 0
AS
BEGIN IF (new.CLIENTJD IS NULL) THEN
CLIENTJD=GENJD(<hmh генератора>, 1);
END,
где 0 – начальное значение; 1 – шаг приращения в текущем значении генератора.
Механизм генераторов гарантирует, что даже при конкурентном (параллельном) вызове функции GEN_ID каждому пользователю будет выдаваться уникальное значение. Последнее значение генератора всегда запоминается в БД, поэтому разработчику не нужно заботиться о восстановлении его максимального значения после подсоединения к БД. Генераторы являются переменными типа integer (longint).
Программный комплекс (БД) "Учебный процесс" содержит три генератора, предназначенных для генерации уникальных кодов:
- • Gen_kkaf – кафедр;
- • Gen_kpreci – предмета;
- • Gcn_Kprp – предприятия.