430 7. SYSTEMOWE ASPEKTY JĘZYKA SQL
Po pierwsze należy wiedzieć, że wszystkie elementy, takie jak schematy lub moduły, w języku SQL mają swoich właścicieli. Właściciel ma z racji swojego statusu wszystkie prawa, które są związane z danym obiektem. Przy' określeniu praw własności w SQL2 występują trzy elementy:
1. Przy tworzeniu schematu zakłada się, że jego właścicielem oraz właścicielem wszystkich elementów schematu, takich jak tabele, jest ten użytkownik, który utworzył schemat. Ten użytkownik posiada wówczas wszystkie możliwe prawa potrzebne do korzy stania ze schematu.
2. Przy otwieraniu sesji przez instrukcję CONNECT istnieje możliwość wskazania użytkownika; służy do tego klauzula USER. Na przykład następująca instrukcja:
CONNECT TO Konstelacja-sal-serwer AS connl USER karol;
spowoduje utworzenie połączenia o nazwie cenni z serwerem o nazwie Kor.stelacja-scl-serwer i odpowiedzialny za tę sesję jest użytkownik identyfikowany jako Karol. Najczęściej implementacja SQL sprawdza autentyczność użytkownika, pytając na przykład o hasło.
3. Przy tworzeniu modułu można określać jego właściciela, stosując klauzulę AUTHORIZATION. Nic będziemy się zagłębiać w szczegóły dotyczące modułów; ponieważ jest to fragment SQL2, który pozostawia sporo swobody, jeśli chodzi o implementacje. Można jednak wyobrazić sobie pewien schemat, gdzie klauzula
AUTHORIZATION piotr;
występująca w instrukcji definicji modułu powoduje, że użytkownik o ID piotr staje się właścicielem tego modułu. Jeśli nie określi się właściciela modułu, to może go wykonywać każdy, ale prawa do wykonywania poszczególnych działań na poszczególnych tabelach muszą być nadane użytkownikowi, który ten moduł uruchamia w danym połączeniu i danej sesji.
Jak już wiemy, każdy moduł, schemat i sesja są powiązane z określonym użytkownikiem; w nomenklaturze SQL mówi się, żc dla każdego elementu zostaje określona autoryzacja. Każde działanie w systemie SQL ma dw ie części:
1. Elementy bazy danych, na który ch działania są wykonywane.
2. Agent, który te działania wykonuje.
Prawa agenta są określane dynamicznie na podstawie bieżącej identyfikacji. Jest to albo:
a) ID wynikające z autoryzacji modułu, jeśli moduł uruchamiany jako agent ma określone ID autoryzacji, albo
b) ID wynikające z autoryzacji sesji.
W systemie SQL operacja może zostać wykonana wyłącznie wtedy, kiedy bieżąca autory zacja ma wszystkie niezbędne w tym celu prawa dostępu.
PRZYKŁAD 7.21
Mechanizmy egzekwowania praw dostępu prześledzimy na działaniach z przykładu 7.20. Można założyć, że tabele używane w tym przykładzie: Film i Studio są elementami schematu o nazwie SchematFilm, którego właścicielem jest użytkownik janka. Użytkownik janka ma wszystkie pra-wa do tabel i innych elementów- schematu Schemat Filia. Może ona nadawać prawa do tych elementów innym użytkownikom dzięki mechanizmom, które zostaną przedstawione w p. 7.4.4, ale na razie zakładamy, że żadne prawa nie zostały jeszcze nadane. Wstawienie z przykładu 7.20 może zostać wykonane na kilka różnych sposobów.
1. Można je wykonać jako fragment modułu utworzonego przez użytkownika janka z zastosowaniem klauzuli AUTHORI ZATION janka. Jeśli ID autoryzujące moduł zostało określone, to pokrywa się ono z autoryzacją bieżącą. Wówczas i moduł i instrukcja INSERT w nim zawarta mają takie same prawa jak użytkownik janka, a więc wszystkie prawa do tabel Film i Studio.
2. Wstawienie może być także fragmentem modułu, dla którego nie określono właściciela. Użytkownik janka otwiera połączenie, używając w instrukcji CONNECT TO klauzuli USER janka. Wówczas janka jest identyfikatorem bieżącym autoryzującym dostęp, co gwarantuje wszystkie niezbędne prawa dostępu.
3. Użytkownik janka nadaje wszystkie prawa dostępu do tabel Film i Studio użytkownikowi stefan albo użytkownikowi PUBLIC, którym może być każdy. Instrukcja wstawiania występuje teraz w module, który ma klauzulę
AUTHORIZATION stefan
Ponieważ stefan posiada autoryzację bieżącą i ma wszystkie potrzebne prawfa dostępu, więc wstawienie jest możliwe.
4. Podobnie jak w punkcie 3 użytkownik stefan otrzymał prawa od użytkownika janka. Instrukcja wstawiania znajduje się w module, dla którego nie został określony właściciel, a jest on uruchamiany podczas