-> 7U 6 WIĘZY 1 WYZWALAĆ/.!- W JĘZYK U SQL
W deklaracji atrybutu można określić bardziej skomplikowane więzy, umieszczając tam słowo kluczowe CHECK, po którym podaje się w nawiasach warunek, który muszą spełniać wszystkie wartości tego atrybutu we wszystkich krotkach. W praktyce więzy typu CHECK nakładają bardzo proste warunki na wartości atrybutu, na przykład zawierają listę poprawnych lub niepoprawnych wfartości. Jednakże warunek może być dowolny, jeśli tylko jego postać jest dopuszczalna w klauzuli WEiERE zapytania SQL. W warunku można używać nazwy atrybutu, którego wartości mają być ograniczane przez ten warunek. Jednakże, jeśli występują w nim inne relacje lub atrybuty relacji, to te relacje muszą być wymienione w klauzuli from podzapytania (nawet jeśli ograniczany atrybut należy' do tej relacji).
Więzy- typu CHECK są sprawdzane zawsze wtedy, kiedy jest określana nowa wartość ograniczanego atrybutu. Nowa wartość może być nadawana w wyniku modyfikacji krotki lub w przypadku dołączania nowej krotki. Jeśli nowa wartość nic spełnia warunku więzów, to polecenie nie zostaje wykonane. W przykładzie 6.7 przekonamy się, że jeśli modyfikacja bazy danych nie dotyczy' atrybutu, dla którego utworzono więzy CHECK, to te więzy nie są sprawdzane i może to spowodować ich naruszenie. Na razie jednak zajmijmy się prostym przykładem w ięzów CHECK.
PRZYKŁAD 6.6
Nasze więzy polegają na tym. że numery' certyfikatów' muszą składać się co najmniej z sześciu cyfr. Deklaracja schematu relacji
Studio (nazwisko, adres, prezC#) z wiersza 4) na rys. 6.3 zostanie wówczas zapisana w następującej postaci:
4) prezC# INT REFERENCES FiimDyr(cert#)
CHECK (prezC# >= 100000)
Z kolei rozpatrzmy inny przykład: ty p atrybutu płeć w relacji
GwiazdaFilinowa(nazwisko, adres, płeć, dataUrodzenia)
został na rys. 5.13 określony jako CHAR {1). tzn. jako jeden znak. Ale ograniczenie jest jeszcze mocniejsze, bowiem ten znak może być tylko albo znakiem 'K' albo znakiem 'M'. Aby nałożyć właśnie takie więzy należy w wierszu 4) na rys. 5.13 umieścić następującą deklarację CHECK:
4) płeć CHAR (1) CItECK (płeć IN {'K', 'M' ) ) ,
W tym warunku występuje jawnie relacja złożona z dwóch wartości 'K' oraz 'M', a powoduje on, że wartości atrybutu płeć muszą należeć do tego zbioru.
□
W warunku CHECK mogą występować nazwy dowolnych relacji lub atrybutów, ale wówczas w tym warunku musi być zdefiniowane podzapytanie, w którym te nazwy są wymienione. Wspominaliśmy już, że warunek może być dowolny, a jego postać jest określona podobnie jak postać warunków klauzuli WHERE instrukcji SELECT-frok-WHSRE. Jednakże trzeba pamiętać, że warunek zasadniczo dotyczy atrybutu, który jest definiowany, a nie wszystkich relacji i atry butów występujących w warunku. Dlatego, jeśli jakiś element występujący w warunku, różny od definiowanego atrybutu, ulegnie modyfikacji, to warunek może przestać być spełniony.
PRZYKŁAD 6.7
Czy daje się wyrazić więzy integralności referencyjnej za pomocą więzów typu CHECK, narzucających warunek obligatoryjnego istnienia wartości powiązanej?. Przedstawiamy próbę określenia wymogu, aby wartość prezc# z pewnej krotki relacji
Studio(nazwisko, adres, prezC#)
występowała w składowej cert# jakiejś krotki w relacji
FilmDyr(nazwisko, adres, cert#, cenaSieci)
Sprawdźmy, jaki efekt spowoduje następująca mody fikacja w wierszu 4) na ry s. 6.3:
4) prezC# INT CHECK
(prezC# IN (SELECT cert# FROM FilmDyr))
Powyższa deklaracja jest prawidłowo zapisanym warunkiem typu CHECK, a w jego konsekwencji wystąpią następujące sytuacje:
• Próba wstawienia nowej krotki do relacji Studio, w której wartość atrybutu prezC# nie jest numerem certyfikatu żadnego prezesa, nie powiedzie się.
• Próba zmodyfikowania wartości atrybutu prezC# relacji Studio, w której nowa wartość atry butu prezC# nie występuje jako wartość atrybutu cert# w relacji FilmDyr, nie powiedzie się.
• Jednakże, jeśli ulegnie zmianie relacja FilmDyr, np. w ten sposób, że zostanie z niej usunięta jakaś krotka opisująca pewnego prezesa, to pozostanie ona niezauważona przez zadeklarowane więzy CHECK.