Установление связей между таблицами

Для создания связей в 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 – предприятия.
 
< Пред   СОДЕРЖАНИЕ     След >