Bazy danych 2 Wykład 5 Structured Query Language (SQL) c.d. DDL
Dziedzina (DOMAIN) Dziedzina to zdefiniowany przez uŝytkownika zbiór dopuszczalnych wartości definiowany niezaleŝnie od definicji tabel Składnia CREATE DOMAIN NazwaDziedziny [AS] TypDanych [[NOT] NULL] [DEFAULT wartość_domyślna] [CHECK (warunek_selekcji)] Warunek selekcji moŝe odnosić się do innej tabeli Do zmiany nazwy dziedziny uŝywamy polecenia ALTER DOMAIN o składni ALTER DOMAIN NazwaDziedziny RENAME NowaNazwa Dziedzinę usuwamy poleceniem DROP DOMAIN NazwaDziedziny [RESTRICT CASCADE]
Dziedzina (DOMAIN) Przykład1 CREATE DOMAIN Płeć AS CHAR NOT NULL DEFAULT 'M' CHECK (VALUE IN ('M', 'K')); Przykład 2 CREATE DOMAIN NumerBiura AS CHAR(4) NULL CHECK (VALUE IN (SELECT biuronr FROM Biuro));
Tworzenie tabeli (CREATE TABLE) CREATE TABLE [ właściciel.]nazwatabeli ( { definicja kolumny[,...]} [ograniczenie dla tabeli[,...]) definicja kolumny : nazwa_kolumny typ_danych [ [ NOT ] NULL ] [UNIQUE] [ DEFAULT wartość_domyślna ] [ ograniczenie dla kolumny [... ]] ograniczenie dla kolumny : [ CONSTRAINT nazwa_ograniczenia ] { PRIMARY KEY REFERENCES NazwaTabeli [( nazwa_kolumny ) ] [ akcja ] } CHECK ( warunek ) ograniczenie dla tabeli: [ CONSTRAINT nazwa_ograniczenia ] {UNIQUE ( nazwa_kolumny[,...] ) PRIMARY KEY ( nazwa_kolumny1[,... ]) CHECK ( warunek ) ograniczenie klucza obcego} ograniczenie klucza obcego FOREIGN KEY [(nazwa_kolumny[,...] ) ] REFERENCES NazwaTabeli [(nazwa_kolumny[,... ]) ] [akcja] [ CHECK ON COMMIT] akcja : ON { UPDATE DELETE }{ CASCADE SET NULL SET DEFAULT RESTRICT }
Więzy integralności NO ACTION lub RESTRICT - uniemoŝliwia usunięcie (modyfikację) krotki z relacji nadrzędnej jeśli występują jakiekolwiek krotki od niej zaleŝne. CASCADE usunięcie (modyfikacja) krotki nadrzędnej pociąga za sobą usunięcie (modyfikację) wszystkich związanych z nią krotek podrzędnych; jeśli krotka podrzędna pełni rolę nadrzędną w innym związku, analogiczna operacja usuwania (modyfikacji) powinna być wykonana dla krotek podrzędnych tego związku. SET NULL usunięcie krotki nadrzędnej pociąga za soną automatyczne nadanie wartości pustych odpowiednim kluczom obcym wszystkich krotek SET DEFAULT usunięcie krotki nadrzędnej pociąga za soną automatyczne nadanie wartości domyślnych odpowiednim kluczom obcym wszystkich krotek podrzędnych.
Tworzenie tabeli (CREATE TABLE) Przykład 1. RównowaŜne sformułowania CREATE TABLE Product ( product_num INTEGER PRIMARY KEY); CREATE TABLE Product ( product_num INTEGER, PRIMARY KEY ( product_num ) Przykład 2 Nieokreślona kolumna w klauzuli FOREIGN KEY CREATE TABLE library_books ( isbn CHAR(20) PRIMARY KEY, copyright_date DATE, title CHAR(100), author CHAR(50), FOREIGN KEY location REFERENCES room)
Tworzenie tabeli (CREATE TABLE) Przykład 3. CREATE TABLE Orders ( order_num INTEGER NOT NULL PRIMARY KEY, date_ordered DATE, name CHAR(80)); CREATE TABLE Order_item ( order_num INTEGER NOT NULL, item_num SMALLINT NOT NULL CHECK(item_num<100), PRIMARY KEY (order_num, item_num), FOREIGN KEY (order_num) REFERENCES Orders (order_num) ON DELETE CASCADE)
Tworzenie tabeli (CREATE TABLE) Przykład 4. CREATE TABLE borrowed_book ( date_borrowed DATE NOT NULL DEFAULT CURRENT DATE, date_returned DATE, book CHAR(20) REFERENCES library_books (isbn), PRIMARY KEY (book), CONSTRAINT GoodDate CHECK( date_returned >= date_borrowed ));
Modyfikacja tabeli (ALTER TABLE) Polecenie ALTER TABLE pozwala zmienić strukture tabeli, która została utworzona Składnia ISO zawiera sześć opcji dodanie nowej koumny do tabeli usunięcie kolumny z tabeli dodanie nowych więzów tabeli usunięcie więzów tabeli ustalenie wartości domyślnej dla kolumny usunięcie wartości domyślnej kolumny zmiana nazwy tabeli, kolumny i reguły
Modyfikacja tabeli (ALTER TABLE) Składnia: ALTER TABLE NazwaTabeli [ADD [COLUMN] {definicja kolumny}] [DROP [COUMN] NazwaKolumny [RESTRICT CASCADE] [ADD [CONSTRAINT [nazwa_ograniczenia]] ograniczenie dla tabeli] [DROP CONSTRAINT nazwa_ograniczenia [RESTRICT CASCADE] [ALTER NazwaKolumny modyfikacja_kolumny] [ALTER nazwa_ograniczenia CHECK ( nowy_warunek ) modyfikacja kolumny : SET DEFAULT wartość domyślna DROP DEFAULT ADD [ CONSTRAINT ] nazwa_ograniczenia CHECK ( warunek ) DROP CONSTRAINT nazwa_ograniczenia
Modyfikacja tabeli (ALTER TABLE) Przykład 1. ALTER TABLE employee ADD office CHAR(20) DEFAULT 'Boston' Przykład 2. ALTER TABLE employee DELETE office Przykład 3. ALTER TABLE customer ADD sales_contact INTEGER REFERENCES employee (emp_id) ON UPDATE CASCADE ON DELETE SET NULL
Modyfikacja tabeli (ALTER TABLE) Przykład 4. ALTER TABLE Personel ALTER stanowisko DROP DEFAULT Przykład 5. ALTER TABLE Personel ALTER płeć SET DEFAULT K' Przykład 6. ALTER TABLE Nieruchomość DROP CONSTRAINT PracownikNadzorującyNieZaDuŜo
Usuwanie tabeli (DROP TABLE) Usuwamy tabelę pleceniem DROP TABLE Składnia DROP TABLE NazwaTabeli [RESTRICT CASCADE] Polecenie DROP TABLE usuwa tabelę wraz z wszystkimi wierszami, jeŝeli chemy tylko usunąć wiersze stosujemy polecenie DELETE
Tworzenie indeksów (CREATE INDEX) Indeks jest struktura przyspieszającą wyszukiwanie wierszy w tabeli Składnia CREATE [ UNIQUE ] INDEX nazwa_indeksu ON NazwaTabeli ( NazwaKolumny [ ASC DESC ] [,...]) Jeśli w poleceniu występuje klauzula UNIQUE system będzie kontrolował unikalność wartości kolumny czy kolumn, według których jest tworzony indeks Najlepiej jest tworzyć unikalne indeksy w momencie tworzenia tabeli Przykład 1. CREATE INDEX employee_name_index ON employee ( emp_lname ASC, emp_fname DESC ) Usuwamy indeks poleceniem DROP INDEKS nazwa_indeksu
Wybór indeksów Wskazówki dotyczące tworzenia listy poŝądanych indeksów NaleŜy utworzyć indeks dla klucza głównego (jeśli nie robi tego BDMS) Jeśli często występują odwołania do klucza obcego, warto utworzyć dla niego indeks (jeśli nie robi tego BDMS). NaleŜy utworzyć indeks pomocniczy dla kolumn, które nie są kluczami głównymi ani kluczami obcymi, ale mogą być uŝywane w złoŝonych powiązaniach NaleŜy utworzyć indeksy pomocnicze dla atrybutów intensywnie wykorzystywanych w: Kryteriach selekcji ORDER BY GROUP BY Innych operacjach wymagających sortowania
Wybór indeksów Wskazówki dotyczące tworzenia listy poŝądanych indeksów Nie naleŝy indeksować małych relacji NaleŜy unikać indeksowania często modyfikowanego atrybutu bądź relacji Nie jest wskazane indeksowanie atrybutu słuŝącego realizacji zapytań, których wynikiem jest istotna frakcja krotek w relacji (>25%) NaleŜy unikać indeksowania atrybutów składających się z długich łańcuchów
Wybór indeksów Z utrzymywaniem i uŝywaniem indeksów wiąŝe się dodatkowy koszt, na który składa się m.in.: Koszt dodania nowego rekordu indeksowego do kaŝdego indeksu pomocniczego przy kaŝdym dodaniu krotki do relacji; Koszt modyfikacji indeksów pomocniczych wynikający z odpowiednich modyfikacji krotek w relacji; Wzrost rozmiaru pamięci dyskowej; MoŜliwość obniŝenia wydajności na etapie optymalizacji zapytań, będąca wynikiem rozwaŝania przez optymalizator uŝycia kaŝdego z indeksów Przy dodawaniu indeksów pomocniczych naleŝy rozwaŝyć, czy ten dodatkowy koszt zostanie zrekompensowany poprzez uzyskaną dzięki indeksowi poprawę wydajności.
Perspektywy (VIEW) Perspektywy tworzymy poleceniem CREATE VIEW Składnia CREATE VIEW nazwa_perspektywy [ ( column-name [,...] ) ] AS zapytanie_select [ WITH CHECK OPTION ] Przykład 1. Perspektywa pozioma CREATE VIEW PersonelBiura3 AS SELECT * FROM Personel WHERE biuronr='003'; Przykład 2. Perspektywa pionowa CREATE VIEW Pesonel3 AS SELECT prcowniknr, imię, nazwisko, stanowisko, płeć FROM PersonelBiura3
Perspektywy (VIEW) Przykład 3. Perspektywa grupująca i perspektywa złą łączenia CREATE VIEW LiczbaNieruchomościPracownika (biuronr, pracowniknr, liczba) AS SELECT p.biuronr, p.pracowniknr, COUNT(*) FROM Personel p, Nieruchomość d WHERE p.pracowniknr=d.pracowniknr GROUP BY p.biuronr, p.pracowniknr; Usuwanie perspektywy wykonujemy za pomocą polecenia DROP VIEW Składnia DROP VIEW nazwa_perspektywy [RESTRICT CASCADE]
Modyfikowanie danych poprzez perspektywy (VIEW) Standard ISO nakłada kilka ograniczań na moŝliwość definiowania i wykorzystywania perspektyw. Nie wolno wykonywać złączenia perspektywy grupującej z tabelą bazową lub inna perspektywą JeŜeli kolumna perspektywy jest wyliczana jako funkcja agregująca, to nazwa takiej kolumny moŝe pojawić sie tylko w klauzulach SELECT lub ORDER BY zapytań wykorzystujących tę perspektywę. Przykład 4. błędna formuła SELECT COUNT(liczba) FROM LiczbaNieruchomościPracownika Przykład 5. błę łędna formuła SELECT * FROM LiczbaNIeruchomościPracownika WHERE liczba>2
Modyfikowanie danych poprzez perspektywy (VIEW) Istnieje moŝliwość dokonywania modyfikacji danych poprzez perspektywy Standard ISO stwierdza, Ŝe perspektywa jest modyfikowalna wtedy i tylko wtedy gdy: Wiersz dodany poprzez perspektywę musi spełniać więzy integralności tabeli bazowej Nie występuje w niej opcja DISTINCT, czyli w wyniku zapytania nie są usuwane powtórzenia wierszy KaŜdy element na liście SELECT zapytania definiującego perspektywę jest nazwa kolumny (a nie stalą, wyraŝeniem, czy funkcją agregującą) i Ŝadna kolumna nie występuje więcej niŝ jeden raz. W klauzuli FROM jest określona tylko jedna tabela, czyli istnieje tylko jedna tabela źródłowa dla perspektywy - w ten sposób wykluczone są perspektywy oparte na złączeniach, czy sumie UNION W zapytaniu definiującym perspektywy nie występuje klauzula GROUP BY Klauzula WHERE nie zawiera Ŝadnego zagnieŝdŝonego podzapytania SELECT, w którym występuje odwołanie do tabeli znajdującej się na liście FROM
Klauzula WITH CHECK OPTION Klauzula WITH CHECK OPTION gwarantuje, Ŝe wiersze, które nie spełniają warunku WHERE zapytania definiującego, nie mogą być dodane poprzez perspektywę do tabeli (tzw. wiersze migrujące) Przyakład 6: CREATE VIEW PersonelBiura3 AS SELECT * FROM Personel WHERE biuronr='003 WITH CHECK OPTION; UPDATE PersonelBiura3 SET biuronr= B005 WHERE pracowniknr= SG37
Wady i zalety perspektyw Zalety perspektyw NiezaleŜność danych perspektywa moŝe reprezentować spójny i niezmienny obraz struktury bazy danych pomimo zmian dokonywanych w tabelach bazowych (pomimo dodawania i usuwania kolumn, zmiany związków, dzielenia tablic, zmiany ich struktury i nazwy) Poprawa bezpieczeństwa kaŝdy uŝytkownik moŝe otrzymać uprawnienia do bazy danych poprzez niewielki zbiór perspektyw, które zawierają potrzebne mu dane Uproszczenie zapytań Dostosowanie do uŝytkownika Integralność danych klauzula WITH CHECK OPTION
Wady i zalety perspektyw Wady perspektyw Ograniczona moŝliwość modyfikacji pewnych danych nie moŝna modyfikować poprzez perspektywy Ograniczenia struktury jeśli tworzona była perspektywa ze wszystkich kolumn tabeli i dodaliśmy nowe kolumny, to nie będą one występowały w perspektywie Wydajność korzystanie z perspektyw moŝe spowodowac spadek wydajności
Mechanizmy bezpieczeństwa (GRANT) Mechanizm bezpieczeństwa jest oparty na takich elementach jak: Identyfikatory uŝytkowników Prawa własności Prawa dostępu Administrator bazy danych (DBA) wyróŝniony uŝytkownik DBA ma moŝliwość tworzenia nowych uŝytkowników KaŜde polecnie SQL wykonywane jest w imieniu pewnego uŝykownika KąŜdy obiekt stworzony w DBMS ma swojego właściciela jest on jedyną osoba, która i ma do niego pełny dostęp Identyfikator uŝytkownika jest wykorzystywany do określenia, do jakich obiektów bazy danych uŝytkownik ma dostęp i jakie operacje moŝe na nich wykonywać
Mechanizmy bezpieczeństwa (GRANT) Osoba z uprawnieniami administratora bazy danych moŝe tworzyć uŝytkowników oraz grupy uŝytkowników Tworzenie uŝytkowników i grup odbywa się w następujący sposób Składnia: GRANT CONNECT TO nazwa_uŝykownika [, ] IDENTIFIED BY password [, ] gdzie nazwa_uŝytkownika jest teŝ nazwą grupy, której będzie moŝna nadać uprawnienia podobnie jak uŝytkownikowi Administrator moŝe następnie nadać utworzonemu uŝytkownikowi uprawnienia DBA, RESOURCES, GROUP Składnia GRANT {DBA RESOURCE GROUP} TO nazwa_uŝytkownika [, ]
Mechanizmy bezpieczeństwa (GRANT) Aby utworzyć grupę musimy utworzonemu uŝytkownikowi, który ma być grupą, nadać uprawnienia grupy Składnia: GRANT GROUP, TO nazwa_uŝytkownika [, ] Następnie moŝemy przypisać uŝytkowników do grupy Składnia: GRANT MEMBERSHIP IN GROUP nazwa_grupy [, ] TO nazwa_uŝytkownika [, ]
Prawa dostępu (GRANT) Prawa dostępu do tabel opisane w standardzie ISO to: SELECT - umoŝliwia odczyt danych MoŜe być limitowany do kolumn INSERT - umoŝliwia dodawanie wierszy do tabeli UPDATE - umoŝliwia modyfikację danych MoŜe być limitowany do kolumn DELETE - umoŝliwia usuwanie wierszy z tabeli ALTER - umoŝliwia wydanie polecenia ALTER TABLE Polecenia zmiany struktury tabeli! REFERENCES - umoŝliwia dodawanie kluczy obcych i indeksów MoŜe być limitowany do kolumn ALL PRIVILLEGES - daje uprawnienia do wszystkich powyŝszych operacji
Prawa dostępu (GRANT) UŜytkownik, który tworzy tabelę staje sie jej właścicielem i uzyskuje do niej pełny dostęp UŜytkownik, który tworzy pespektywę staje sie jej właścicielem, ale niekoniecznie posiada do niej pełne prawa - prawa INSERT, UPDATE i DELETE do perspektywy jej właściciel uzyskuje tylko wtedy gdy posiada odpowiednie prawa do tabel występujących w perspektywie Składnia GRANT {ALL [ PRIVILEGES ], ALTER, DELETE, INSERT, REFERENCES [ ( nazwa_kolumny [,... ]) ], SELECT [ ( nazwa_kolumny [,...] ) ], UPDATE [ ( nazwa_kolumny [,...] ) ]} ON NazwaTabeli TO {nazwa_uŝytkownika [,...] PUBLIC} [ WITH GRANT OPTION ] Klauzula WITH GRANT OPTION pozwala zbywać uzyskane prawo innym uŝytkownikom
Prawa dostępu (GRANT) Prawa dostępu moga byc przekazywane przez: DBA Właściciela tabeli UŜytkowników z opcją WITH GRANT OPTION UŜytkownik będący członkami grupy dziedziczą tylko i wyłącznie prawa dostępu do tabel, ale nie dziedziczą praw DBA, RESOURCE, GROUP UWAGA: Grupa moŝe tworzyć tabelę jeśli ma uprawnienia co najmniej RESOURCE logując się nazwą_uŝytkownika będącego nazwą grupy
Prawa dostępu (GRANT) Prawa dostępu do tabel odbierane są poleceniem REVOKE Składnia REVOKE [GRANT OPTION FOR]{lista_praw ALL[PRIVILEGES]} ON NazwaTabeli FROM {lista_identyfikatorów_uŝytkowników PUBLIC} [RESTRICT] [CASCADE] Inne uprawnienia mogą być usuwane przez administratora za pomocą polecenia Składnia REVOKE specialne_uprawnienia [, ] FROM userid [, ] Gdzie specialne_uprawnienia CONNECT DBA GROUP MEMBERSHIP IN GROUP userid,... RESOURCE
Prawa dostępu (GRANT) UŜytkownicy mogą tworzyć procedury składowane (o tym później). UŜytkownik moŝe wykonywać taką procedurę o ile ma do niej uprawnienia. Prawo wykonywania procedury nadawane jest poleceniem GRANT Składnia GRANT EXECUTE ON procedure_name TO nazwa_uŝytkownika [, ] Prawo wykonywania procedury odbierane jest poleceniem REVOKE Składnia REVOKE EXECUTEON procedure-name FROM userid [, ]
Dziękuję za uwagę