398 6. WIĘZY l WYZWALACZE W JĘZYKU SOL
Mimo że ascrcja obejmuje dwie relacje, to można takie więzy wyrazić również za pomocą więzów krotkowych typu CHECK, zdefiniowanych osobno dla poszczególnych relacji. Możemy na przykład do definicji create TABLE z przykładu 6.3 dołączyć więzy relacji Studio, tak jak pokazano na rys. 6.6.
1) CREA7E TABLE Studio (
2) nazwa CHAR(30) PRIMARY KEY,
3) adres VARCHAR(255),
4) prezC= INT REFERENCES FilmDyr (cert#) ,
5) CHECK (prezC# NOT IN
6) (SELECT cert# FROM FilmDyr
7) trIHSRE cenaSieci < 1000000C)
)
);
RYSUNKK 6.6
Więzy w relacji Stuaic, równoważne asercji
Zauważmy jednak, że więzy przedstawione na rys. 6.6 będą sprawdzane jedynie wtedy, kiedy zajdzie zmiana dotycząca relacji Studio. Wobec tego nie zostanie na przykład wykryta sytuacja polegająca na tym, że wartość sieci pewnego prezesa zapisana w relacji FilmDyr spada poniżej 10 000 000 $. Aby uzyskać kompletny efekt działania asercji, trzeba by dołączyć do deklaracji tabeli FilmDyr jeszcze jedne więzy, które sprawdzają, czy jeśli dyrektor jest prezesem studia, to wartość jego sieci nie jest niższa niż 10 000 000 $.
□
PRZYKŁAD 6.11
A oto jeszcze jeden przykład asercji. Dotyczy ona wyłącznie relacji
Film(tytuł, rok, długość, czyKolor, nazwaStudia, producent"#)
i określa, że całkowita długość wszystkich filmów w danym studiu nic przekracza 10 000 minut.
CREA7E ASSERTION SumDługość CHECK {10000>=ALL (SELECT SUM (długość)FROM Movie GROUP 3Y nazwaStudia);
)
Tak się składa, że więzy dotyczą tylko relacji Film. Można wyrazić jc także za pomocą więzów krotkowych typu CHECK w schemacie relacji Film. Definicja tych więzów polegałaby na dołączeniu do schematu relacji Filrn następującej deklaracji:
CHECK (10000 >= ALL
(SELECT SUM (długość) FROM Film GROUP BY nazwaStudia));
Zauważmy, że w zasadzie ten warunek stosuje się do każdej krotki relacji Film. Jednakże nie wspomina się tu o żadnym atrybucie i przetwarzanie jest skupione w podzapytaniu.
Typ więzów |
Gdzie są deklarowane |
Kiedy uruchamiane |
Czy zachodzą |
Atrybutowe CHECK |
Z atrybutami |
Przy wstawianiu do relacji lub zmianie wartości atrybutu |
Nie w podza-pytaniach |
Krotkowe CHECK |
Element schematu relacji |
Przy wstawianiu do relacji lub zmianie wartości w krotce |
Nie w podza-pytaniach |
Ascrcje |
Element schematu bazy danych |
Przy modyfikacji w relacji |
Tak |
Porównanie Więzów
W tabeli przedstawionej poniżej zilustrowano różnice pomiędzy więzami atrybutów, więzami krotkowymi i asercjami.
Zauważmy, że w przypadku deklarowania więzów krotkowych sprawdzenie nie wykona się przy usuwaniu krotek z relacji Fi lir.. W omawianym przykładzie nie ma to akurat znaczenia, ponieważ, jeśli więzy są tutaj spełnione przed usuwaniem, pozostaną one spełnione tym bardziej po usunięciu krotki. Jednakże, jeśli więzy ograniczałyby długość wyprodukowanych filmów z dołu, a nie z góry, to więzy CHECK byłyby przez usuwanie naruszane, a ascrcja nie.
□
Ćwiczenie 6.4.1. W podrozdziale 6.10 wspominaliśmy, że krotkowe więzy CHECK z rys. 6.6 zapewniają wykonanie tylko połowy tego co asercja z rys. 6.5. Należy napisać więzy typu CllECK dla relacji FilmDyr. które będą równoważne tej asercji.
Ćwiczenie 6.4.2. Dla przykładu filmowego, który obejmuje relacje:
Film (tytiui, rok, długość, czyKolor, nazwaStudia, producentC#)