Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БД_Курсов (КН)_з_прикладом!.doc
Скачиваний:
7
Добавлен:
20.11.2019
Размер:
7.21 Mб
Скачать

2.2 Зв’язування таблиць

Для встановлення зв’язків між таблицями та визначення умов цілістності даних використовуються первинні та зовнішні ключі.

У базі даних “ABITYRIENT” були створені первинні ключі в усіх таблицях з ім’ям (PRKEY) для забеспечення унікальності кожного запису в таблиці. Зовнішні ключи явно не створювались, але поля для логічного зв’язку таблиць передбачені, ціліснісь даних контролюється за допомогою тригерів.

Тригер - це окрема програма, асоційована з таблицею або видом, що автоматично виконує дії при додавані, зміни та видаленні рядка в таблиці або виді.

2.3 Встановлення умов цілостності даних.Створення тригерів.

Таблиця FACULT містить довідник факультетів. На факультет може посилатися запис з таблиці SPECIALIT за допомогою зовнішнього ключа LFACULT. Очевидно, що не можна видаляти факультет, поки на нього посилається хоча б одна спеціальність. Для того, щоб проконтролювати видалення запису з таблиці FACULT, створений тригер FACULT_BD_01:

CREATE TRIGGER FACULT_BD_01 FOR FACULT BEFORE DELETE POSITION 1 AS

DECLARE VARIABLE LCNT INTEGER;

BEGIN

SELECT COUNT(S.PRKEY)

FROM SPECIALIT S

WHERE S.LFACULT=OLD.PRKEY

INTO :LCNT;

IF(LCNT>0)THEN EXCEPTION HASLINKS;

DELETE FROM FACULTREGID

WHERE LFACULT=OLD.PRKEY;

END

При наявності посилання з таблиці SPECIALIT на запис таблиці FACULT, що видаляється, буде викликана виняткова ситуація і видалення запису буде заборонено.

Таблиця SPECIALIT містить довідник спеціальностей. На цю таблицю за допомогою зовнішнього ключа посилаються записи таблиці ENTRANT. Тригер SPECIALIT_BD_01 заборонить видалення запису з таблиці SPECIALIT якщо є абітурієнти, що подали заяву на спеціальність, що видаляється.

CREATE TRIGGER SPECIALIT_BD_01 FOR SPECIALIT BEFORE DELETE POSITION 1 AS

DECLARE VARIABLE LCNT INTEGER;

BEGIN

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LSPECIALIT=OLD.PRKEY

INTO :LCNT;

IF(LCNT>0)THEN EXCEPTION HASLINKS;

END

Аналогічна перевірка необхідна при видаленні записів з таблиць TOWN, FORLANG і EDINST. Нижче описані тригери, що контролюють видалення записів з цих таблиць:

CREATE TRIGGER TOWN_BD_01 FOR TOWN BEFORE DELETE POSITION 1 AS

DECLARE VARIABLE LCNT INTEGER;

BEGIN

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LTOWN=OLD.PRKEY

INTO :LCNT;

IF(LCNT>0)THEN EXCEPTION HASLINKS;

END

CREATE TRIGGER FORLANG_BD_01 FOR FORLANG BEFORE DELETE POSITION 1 AS

DECLARE VARIABLE LCNT INTEGER;

BEGIN

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LFORLANG=OLD.PRKEY

INTO :LCNT;

IF(LCNT>0)THEN EXCEPTION HASLINKS;

END

CREATE TRIGGER EDINST_BD_01 FOR EDINST BEFORE DELETE POSITION 1 AS

DECLARE VARIABLE LCNT INTEGER;

BEGIN

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LEDINST=OLD.PRKEY

INTO :LCNT;

IF(LCNT>0)THEN EXCEPTION HASLINKS;

END

Зв'язок між таблицями ENTRANT і PRIVIL є найбільш складний. Тому що для зв'язку абітурієнтів з пільгами необхідний зв'язок “багато – до – багатьох”, створена додаткова таблиця ENTRANTPRIVIL. Ця таблиця містить два зовнішніх ключі LENTRANT і LPRIVIL, за допомогою яких вона посилається на таблиці ENTRANT і PRIVIL. Цим забезпечується можливість одному абітурієнту користатися декількома пільгами одночасно.

При видаленні запису з таблиці PRIVIL тригер PRIVIL_BD_01 перевіряє використання абітурієнтами пільги, що видаляється,. Якщо існують абітурієнти, що користаються цією пільгою, то видалення скасовується.

CREATE TRIGGER PRIVIL_BD_01 FOR PRIVIL BEFORE DELETE POSITION 1 AS

DECLARE VARIABLE LCNT INTEGER;

BEGIN

SELECT COUNT(E.PRKEY)

FROM ENTRANTPRIVIL E

WHERE E.LPRIVIL=OLD.PRKEY

INTO :LCNT;

IF(LCNT>0)THEN EXCEPTION HASLINKS;

END

При видаленні запису з таблиці ENTRANT необхідно видалити записи з таблиці ENTRANTPRIVIL, що відповідали за зв'язок пільг з абітурієнтом, що видаляється. Для цього використовується тригер ENTRANT_BD_01:

CREATE TRIGGER ENTRANT_BD_01 FOR ENTRANT BEFORE DELETE POSITION 1 AS

BEGIN

DELETE FROM ENTRANTPRIVIL

WHERE LENTRANT=OLD.PRKEY;

END