Relacyjne bazy danych – ciąg dalszy. Język SQL. Reprezentacją relacji jest dwuwymiarowa tabela złożona z kolumn i wierszy. Tabela ta musi spełniać następujące założenia: Liczba kolumn jest z góry ustalona. Z każdą kolumną jest związana jej nazwa oraz dziedzina, określająca zbiór wartości, jakie mogą wystąpić w kolumnie. Na przecięciu wiersza i kolumny znajduje się pojedyncza (atomowa) wartość należąca do dziedziny kolumny. Wiersz reprezentuje jeden rekord informacji np. osobę. W modelu relacyjnym abstrahujemy od kolejności wierszy (rekordów) i kolumn (pól w rekordzie). np.: Tabela wykładowców IdWykładowcy Imię Nazwisko Tytuł 2137 Jan Kowalski Doktor 3245 Maciej Jankowski Docent 8976 Artur Malinowski Profesor Relacje między tabelami i więzy integralności. W relacyjnej bazie danych relacje między tabelami pozwalają zapobiec występowaniu powtarzających (nadmiarowych) danych. Wyróżnia się trzy typy relacji między tabelami. 1. Jedne – do – Wielu (1 – ∞) 2. Wiele – do – Wielu (∞– ∞) 3. Jeden – do – Jednego (1 – 1) Jeden – do – Jednego Typ relacji jeden-do-jednego występuje wtedy, gdy pojedynczy rekord w jednej tabeli jest powiązany z pojedynczym rekordem w innej tabeli i odwrotnie. Na przykład do jednego wyspecjalizowanego serwera plików może być przydzielony jeden technik. Jedne – do – Wielu Typ relacji jeden-do-wielu występuje wtedy, gdy jeden rekord w tabeli jest powiązany z wieloma rekordami w innej tabeli. Na przykład jeden pracownik może korzystać z kilku składników majątku, takich jak komputer, krzesło i biurko. Wiele – do – Wielu Typ relacji wiele-do-wielu występuje wtedy, gdy kilka rekordów w jednej tabeli jest powiązanych z kilkoma rekordami w innej tabeli. Na przykład w firmie może się znajdować wiele komputerów obsługiwanych przez kilku techników. Wielu techników może być odpowiedzialnych za wiele komputerów. Relacje mają „strony”. Na przykład jeden dostawca może dostarczać wiele składników majątku, więc tabela Dostawcy znajduje się po stronie „jeden” relacji, a tabela Składniki majątku po stronie „wiele”, co przedstawiono na ilustracji. Ale każdy składnik jest dostarczany prze jednego dostawcę więc z punktu widzenia składnika jest powiązany z jednym dostawcą. Należy zapamiętać następującą regułę: w celu utworzenia relacji jeden-do-wielu należy użyć klucza podstawowego z tabeli po stronie „jeden” jako klucza obcego w tabeli po stronie „wiele”. Ta sama reguła dotyczy także relacji jeden-do-jednego i wiele-do-wielu, ale występują pewne różnice. Język SQL. SQL (ang. Structured Query Language wym. /ɛskjuːˈɛl/) – strukturalny język zapytań używany do tworzenia, modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych. Język SQL jest językiem deklaratywnym. Decyzję o sposobie przechowywania i pobrania danych pozostawia się systemowi zarządzania bazą danych (DBMS). SQL został opracowany w latach 60. w firmie IBM. Stał się standardem w komunikacji z serwerami relacyjnych baz danych. Wiele współczesnych systemów relacyjnych baz danych używa do komunikacji z użytkownikiem SQL, dlatego potocznie mówi się, że korzystanie z relacyjnych baz danych to korzystanie z SQL-a. Pierwszą firmą, która włączyła SQL do swojego produktu komercyjnego, był Oracle. W 1986 SQL stał się oficjalnym standardem, wspieranym przez Międzynarodową Organizację Normalizacyjną (ISO) i jej członka, Amerykański Narodowy Instytut Normalizacji (ANSI). Wczesne wersje specyfikacji (SQL86 i SQL89) były w dużej mierze jedynie określeniem wspólnej płaszczyzny łączącej różne istniejące wówczas produkty i pozostawiały wiele swobody twórcom implementacji Z technicznego punktu widzenia, SQL jest podjęzykiem danych. Oznacza to, że jest on wykorzystywany wyłącznie do komunikacji z bazą danych. Jego wykorzystanie może być trojakie i z tego względu wyróżnia się trzy formy SQL-a: SQL interakcyjny (autonomiczny) wykorzystywany jest przez użytkowników w celu bezpośredniego pobierania lub wprowadzania informacji do bazy. Statyczny kod SQL (Static SQL) nie ulega zmianom i pisany jest wraz z całą aplikacją, podczas której pracy jest wykorzystywany. . Statyczny SQL występuje w dwóch odmianach. Embedded SQL (Osadzony SQL) oznacza włączenie kodu SQL do kodu źródłowego innego języka. Większość aplikacji pisana jest w takich językach jak C++ czy Java, jedynie odwołania do bazy danych realizowane są w SQL. Język modułów. W tym podejściu moduły SQL łączone są z modułami kodu w innym języku. Moduły kodu SQL przenoszą wartości do i z parametrów, podobnie jak to się dzieje przy wywoływaniu podprogramów w większości języków proceduralnych. Dynamiczny kod SQL (Dynamic SQL) generowany jest w trakcie pracy aplikacji. Wykorzystuje się go w miejsce podejścia statycznego, jeżeli w chwili pisania aplikacji nie jest możliwe określenie treści potrzebnych zapytań – powstaje ona w oparciu o decyzje użytkownika. Użycie SQL, zgodnie z jego nazwą, polega na zadawaniu zapytań do bazy danych. Zapytania można zaliczyć do jednego z czterech głównych podzbiorów: • • • • SQL DML (ang. Data Manipulation Language – „język manipulacji danymi”), SQL DDL (ang. Data Definition Language – „język definicji danych”), SQL DCL (ang. Data Control Language – „język kontroli nad danymi”). SQL DQL (ang. Data Query Language – „język definiowania zapytań”). Instrukcje SQL w obrębie zapytań tradycyjnie zapisywane są wielkimi literami, jednak nie jest to wymóg. Każde zapytanie w SQL-u musi kończyć się znakiem średnika. DDL (Data Definition Language) pozwala operować na strukturach, w których dane są przechowywane – czyli np. dodawać, zmieniać i kasować tabele lub bazy. Najważniejsze polecenia tej grupy to: CREATE (np. CREATE TABLE, CREATE DATABASE, ...) – utworzenie struktury (bazy, tabeli, indeksu itp.), DROP (np. DROP TABLE, DROP DATABASE, ...) – usunięcie struktury, ALTER (np. ALTER TABLE ADD COLUMN ...) – zmiana struktury (dodanie kolumny do tabeli, zmiana typu danych w kolumnie tabeli). DCL (Data Control Language) ma zastosowanie do nadawania uprawnień do obiektów bazodanowych. Najważniejsze polecenia w tej grupie to: GRANT - służące do nadawania uprawnień do pojedynczych obiektów lub globalnie konkretnemu użytkownikowi (np. GRANT ALL PRIVILEGES ON EMPLOYEE TO PIOTR WITH GRANT OPTION – przyznanie wszystkich praw do tabeli EMPLOYEE użytkownikowi PIOTR z opcją pozwalającą mu nadawać prawa do tej tabeli). REVOKE – służące do odbierania wskazanych uprawnień konkretnemu użytkownikowi (np. REVOKE ALL PRIVILEGES ON EMPLOYEE FROM PIOTR - odebranie użytkownikowi wszystkich praw do tabeli EMPLOYEE). DENY. - służące do odbierania uprawnień do pojedynczych obiektów lub globalnie DML (Data Manipulation Language) służy do wykonywania operacji na danych – do ich umieszczania w bazie, kasowania, przeglądania oraz dokonywania zmian. Najważniejsze polecenia z tego zbioru to: INSERT – umieszczenie danych w bazie, UPDATE – zmiana danych, DELETE – usunięcie danych z bazy. Dane tekstowe muszą być zawsze ujęte w znaki pojedynczego cudzysłowu ('). DQL (Data Query Language) to język formułowania zapytań do bazy danych. W zakres tego języka wchodzi jedno polecenie - SELECT. Często SELECT traktuje się jako część języka DML, ale to podejście nie wydaje się właściwe, ponieważ DML z definicji służy do manipulowania danymi - ich tworzenia, usuwania i uaktualniania. Na pograniczu obu języków znajduje się polecenie SELECT INTO, które dodatkowo modyfikuje (przepisuje, tworzy) dane. Jako że SQL jest językiem interpretowanym, istnieje możliwość nadużyć. Jeśli twórca aplikacji nie zadba o sprawdzenie poprawności (tzw. walidację) danych wejściowych stanowiących część zapytania, atakujący może być w stanie dopisać do zapytania („wstrzyknąć”) dodatkowe komendy lub zmienić ich sposób działania. Atak taki nosi nazwę SQL injection (wstrzyknięcie kodu za pomocą SQL).