Skip to content

2. Samouczek Firebird

Zanim przejdziemy do omówienia podstaw języka SQL, przedstawimy czytelnikowi sposób instalacji serwera Firebird SGBD oraz graficznego klienta IB-Expert.

2.1. Gdzie znaleźć Firebird?

Główna strona serwisu poświęcona Firebirdowi to [http://firebird.sourceforge.net/]. Strona z plikami do pobrania zawiera następujące linki (kwiecień 2005 r.):

Image

Należy pobrać następujące pliki:

firebird-win32
plik SGBD dla systemu Windows
firebird-net-provider
bibliotekę klas dla aplikacji .NET, która umożliwia dostęp do SGBD bez konieczności korzystania ze sterownika ODBC.
firebird-ODBC-driver
sterownik ODBC dla Firebirda

Zainstaluj te elementy. SGBD jest zainstalowany w folderze, którego zawartość wygląda mniej więcej tak:

Pliki binarne znajdują się w folderze [bin]:

fbguard.exe
umożliwia uruchomienie/zatrzymanie pliku SGBD
isql.exe
klient liniowy służący do zarządzania bazami danych

Należy zauważyć, że domyślnie administrator SGBD nosi nazwę [SYSDBA], a jego hasło to [masterkey]. W [Démarrer] zainstalowano następujące menu:

Image

Opcja [Firebird Guardian] pozwala uruchomić/zatrzymać SGBD. Po uruchomieniu ikona SGBD pozostaje na pasku zadań systemu Windows:

Aby tworzyć i obsługiwać bazy danych Firebird za pomocą klienta wiersza poleceń [isql.exe], należy zapoznać się z dokumentacją dołączoną do produktu w folderze [doc].

2.2. dokumentacja Firebird

Dokumentacja dotycząca Firebirda oraz języka SQL jest dostępna na stronie internetowej Firebirda (styczeń 2006 r.):

Image

Dostępne są różne podręczniki w języku angielskim:

Firebird 1.5 Quick Start Guide
aby rozpocząć pracę z FB
Firebird 1.5 Error Codes
aby zrozumieć kody błędów zwracane przez FB

Dostępne są również podręczniki szkoleniowe dotyczące języka SQL:

Image

Data Definition Guide
aby dowiedzieć się, jak tworzyć tabele, jakie typy danych można wykorzystać itp.
Language Reference
przewodnik referencyjny do nauki języka SQL z wykorzystaniem Firebirda

Szybkim sposobem na pracę z Firebirdem i naukę języka SQL jest użycie klienta graficznego. Takim klientem jest IB-Expert, opisany w następnym akapicie.

2.3. Praca z Firebirdem w języku SGBD za pomocą IB- Expert

Główna strona serwisu IB-Expert to [http://www.ibexpert.com/]. Strona z plikami do pobrania zawiera następujące linki:

Image

Wybierzemy darmową wersję [Personal Edition]. Po jej pobraniu i zainstalowaniu otrzymujemy folder podobny do poniższego:

Image

Plik wykonywalny to [ibexpert.exe]. Skrót jest zazwyczaj dostępny w menu [Démarrer]:

Image

Po uruchomieniu program IBExpert wyświetla następujące okno:

Image

Skorzystajmy z opcji [Database/Create Database] „ ” (Utwórz bazę danych), aby utworzyć bazę danych:

Server
może to być [local] lub [remote]. W tym przypadku nasz serwer znajduje się na tym samym komputerze co [IBExpert]. Wybieramy zatem [local]
Database
użyj przycisku typu [dossier] z listy rozwijanej, aby wskazać plik bazy danych. Firebird umieszcza całą bazę danych w jednym pliku. Jest to jedna z jego zalet. Bazę danych przenosi się z jednego komputera na drugi poprzez proste skopiowanie pliku. Sufiks [.gdb] jest dodawany automatycznie.
Username
SYSDBA jest domyślnym administratorem w aktualnych dystrybucjach Firebirda
Password
masterkey to hasło administratora SYSDBA w aktualnych dystrybucjach Firebirda
Dialect
dialekt, którego należy używać: SQL
Register Database
jeśli pole jest zaznaczone, IBExpert wyświetli link do utworzonej bazy danych po jej utworzeniu

Jeśli po kliknięciu przycisku tworzenia [OK] pojawi się następujące ostrzeżenie:

Image

oznacza to, że nie uruchomiono programu Firebird. Należy go uruchomić. Pojawi się nowe okno:

Image

Charset
Rodzina czcionek do użycia. Chociaż powyższy zrzut ekranu nie zawiera żadnych informacji, zaleca się wybranie z listy rozwijanej rodziny czcionek [ISO-8859-1], która umożliwia użycie znaków łacińskich z akcentami.
Server version
[IBExpert] obsługuje różne wersje SGBD pochodzące z Interbase. Należy wybrać wersję Firebirda, którą masz zainstalowaną:

Po zatwierdzeniu tego nowego okna przez [Register] otrzymujemy następujący wynik:

Image

Aby uzyskać dostęp do utworzonej bazy danych, wystarczy dwukrotnie kliknąć jej link. IBExpert wyświetla wówczas drzewo folderów, umożliwiające dostęp do właściwości bazy danych:

Image

2.4. Tworzenie tabeli danych

Utwórzmy tabelę. Klikamy prawym przyciskiem myszy na [Tables] (patrz okno powyżej) i wybieramy opcję [New Table]. Pojawia się okno definiowania właściwości tabeli:

Zacznijmy od nadania tabeli nazwy [ARTICLES], korzystając z pola wprowadzania danych [1]:

Skorzystajmy z pola wprowadzania danych [2], aby zdefiniować klucz główny [ID]:

Pole można ustawić jako klucz główny, klikając dwukrotnie pole [PK] (Primary Key) w danym polu. Dodajmy pola za pomocą przycisku znajdującego się nad polem [3]:

Image

Dopóki nie „skompilujemy” naszej definicji, tabela nie zostanie utworzona. Użyjmy przycisku [Compile] powyżej, aby zakończyć definiowanie tabeli. IBExpert przygotowuje zapytania SQL służące do wygenerowania tabeli i prosi o potwierdzenie:

Image

Co ciekawe, IBExpert wyświetla zapytania SQL, które wykonał. Pozwala to na zapoznanie się zarówno z językiem SQL, jak i z ewentualnie stosowanym, zastrzeżonym dialektem SQL. Przycisk [Commit] służy do zatwierdzenia bieżącej transakcji, a [Rollback] – do jej anulowania. W tym przypadku akceptujemy ją za pomocą [Commit]. Po wykonaniu tej czynności IBExpert dodaje utworzoną tabelę do struktury drzewa naszej bazy danych:

Image

Po dwukrotnym kliknięciu na tabelę uzyskujemy dostęp do jej właściwości:

Image

Panel [Constraints] pozwala nam dodać nowe ograniczenia integralności do tabeli. Otwórzmy go:

Image

Widzimy tu utworzone przez nas ograniczenie klucza głównego. Można dodać inne ograniczenia:

  • klucze obce [Foreign Keys]
  • ograniczenia integralności pól [Checks]
  • ograniczenia unikalności pól [Uniques]

Należy zaznaczyć, że:

  • pola [ID, PRIX, STOCKACTUEL, STOKMINIMUM] muszą mieć wartość >0
  • Pole [NOM] musi być niepuste i unikalne

Otwórzmy panel [Checks] i kliknijmy prawym przyciskiem myszy w obszarze definiowania ograniczeń, aby dodać nowe ograniczenie:

Image

Zdefiniujmy żądane ograniczenia:

Image

Należy zauważyć, że w powyższym przykładzie ograniczenie [NOM<>''] wykorzystuje dwa apostrofy, a nie cudzysłowy. Skompilujmy te ograniczenia za pomocą przycisku [Compile] powyżej:

Image

Również w tym przypadku IBExpert pełni funkcję edukacyjną, wskazując zapytania SQL, które wykonał. Przejdźmy teraz do panelu [Constraints/Uniques], aby zaznaczyć, że nazwa musi być unikalna. Oznacza to, że w tabeli nie może występować dwukrotnie ta sama nazwa.

Image

Zdefiniujmy ograniczenie:

Image

Następnie skompilujmy ją. Po zakończeniu otwórzmy panel [DDL] (Data Definition Language) tabeli [ARTICLES]:

Image

Z panelu tego otrzymujemy kod SQL służący do wygenerowania tabeli wraz ze wszystkimi jej ograniczeniami. Kod ten można zapisać w skrypcie, aby móc go później ponownie uruchomić:

SET SQL DIALECT 3;
SET NAMES NONE;
CREATE TABLE ARTICLES (
    ID            INTEGER NOT NULL,
    NOM           VARCHAR(20) NOT NULL,
    PRIX          DOUBLE PRECISION NOT NULL,
    STOCKACTUEL   INTEGER NOT NULL,
    STOCKMINIMUM  INTEGER NOT NULL
);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_ID check (ID>0);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_PRIX check (PRIX>0);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_STOCKACTUEL check (STOCKACTUEL>0);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_STOCKMINIMUM check (STOCKMINIMUM>0);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_NOM check (NOM<>'');
ALTER TABLE ARTICLES ADD CONSTRAINT UNQ_NOM UNIQUE (NOM);
ALTER TABLE ARTICLES ADD CONSTRAINT PK_ARTICLES PRIMARY KEY (ID);

2.5. Wprowadzanie danych do tabeli

Nadszedł czas, aby wprowadzić dane do tabeli [ARTICLES]. W tym celu skorzystajmy z jej panelu [Data]:

Image

Dane wprowadza się poprzez dwukrotne kliknięcie pól wprowadzania danych w każdym wierszu tabeli. Nowy wiersz dodaje się za pomocą przycisku [+], a wiersz usuwa się za pomocą przycisku [-]. Operacje te są wykonywane w ramach transakcji, którą zatwierdza się przyciskiem [Commit Transaction] (patrz powyżej). Bez tego zatwierdzenia dane zostaną utracone.

2.6. Edytor SQL z [IB-Expert]

Język SQL (Structured Query Language) umożliwia użytkownikowi:

  1. tworzyć tabele, określając typ danych, które będą w nich przechowywane, oraz ograniczenia, które dane te muszą spełniać
  1. wstawianie do nich danych
  2. modyfikować niektóre z nich
  3. usuwanie niektórych danych
  4. wykorzystywać zawartość tabel w celu uzyskania informacji
  5. ...

IBExpert umożliwia użytkownikowi wykonywanie czynności od 1 do 4 w sposób graficzny. Właśnie to widzieliśmy. Gdy baza zawiera wiele tabel, z których każda ma setki wierszy, potrzebne są informacje trudne do uzyskania wizualnie. Załóżmy na przykład, że wirtualny sklep internetowy ma tysiące kupujących miesięcznie. Wszystkie zakupy są rejestrowane w bazie danych. Po sześciu miesiącach okazuje się, że produkt „X” ma wadę. Chcemy skontaktować się ze wszystkimi osobami, które go kupiły, aby zwróciły produkt w celu bezpłatnej wymiany. Jak znaleźć adresy tych kupujących?

  1. Można przejrzeć wszystkie tabele i ręcznie wyszukać tych klientów. Zajmie to kilka godzin.
  2. Można wygenerować polecenie SQL, które w ciągu kilku sekund wygeneruje listę tych osób

Język SQL jest przydatny już

  • gdy ilość danych w tabelach jest duża
  • gdy istnieje wiele powiązanych ze sobą tabel
  • gdy informacje, które chcemy uzyskać, są rozproszone w wielu tabelach
  • ...

Przedstawiamy teraz edytor SQL programu IBExpert. Dostęp do niego można uzyskać poprzez opcję [Tools/SQL Editor] lub [F12]:

Image

Otrzymujemy wówczas dostęp do zaawansowanego edytora zapytań SQL, za pomocą którego można testować zapytania. Wpiszmy zapytanie:

Image

Wykonujemy zapytanie SQL za pomocą przycisku [Execute] znajdującego się powyżej. Otrzymujemy następujący wynik:

Image

Powyżej zakładka [Results] przedstawia tabelę wyników zlecenia SQL [Select]. Aby złożyć nowe zlecenie SQL, wystarczy powrócić do zakładki [Edit]. Znajdziemy tam wówczas zlecenie SQL, które zostało już zrealizowane.

Image

Przydatnych jest kilka przycisków na pasku narzędzi:

  • przycisk [New Query] pozwala przejść do nowego zapytania SQL:

Image

W ten sposób otrzymujemy pustą stronę edycji:

Image

Można wtedy wpisać nowe polecenie SQL:

Image

i wykonać go:

Image

Wróćmy do zakładki [Edit]. Poszczególne wydane polecenia SQL są zapamiętane przez [IB-xpert]. Przycisk [Previous Query] pozwala powrócić do wcześniej wygenerowanego zlecenia SQL:

Image

W ten sposób powraca się do poprzedniego zapytania:

Image

Przycisk [Next Query] pozwala natomiast przejść do następnego zlecenia SQL:

Image

Następnie odnajdujemy zlecenie SQL, które znajduje się w liście zapisanych zleceń SQL:

Image

Przycisk [Delete Query] pozwala usunąć zlecenie SQL z listy zapisanych zleceń:

Image

Przycisk [Clear Current Query] pozwala wyczyścić zawartość edytora dla wyświetlonego zlecenia SQL:

Image

Przycisk [Commit] pozwala na ostateczne zatwierdzenie zmian wprowadzonych w bazie danych:

Image

Przycisk [RollBack] pozwala cofnąć zmiany wprowadzone w bazie od ostatniego naciśnięcia przycisku [Commit]. Jeśli od momentu połączenia z bazą nie naciśnięto przycisku [Commit], cofnięte zostaną zmiany wprowadzone od momentu tego połączenia.

Image

Weźmy przykład. Dodajmy nowy wiersz do tabeli:

Image

Polecenie SQL zostało wykonane, ale nie pojawił się żaden wynik. Nie wiadomo, czy wstawienie się powiodło. Aby to sprawdzić, wykonajmy polecenie SQL następujące po [New Query]:

Image

Otrzymujemy następujący wynik dla [Execute]:

Image

Wiersz został więc pomyślnie wstawiony. Przyjrzyjmy się teraz zawartości tabeli w inny sposób. Kliknijmy dwukrotnie na tabelę [ARTICLES] w eksploratorze baz danych:

Image

Otrzymujemy następującą tabelę:

Image

Przycisk ze strzałką powyżej pozwala odświeżyć tabelę. Po odświeżeniu powyższa tabela nie ulega zmianie. Wydaje się, że nowy wiersz nie został wstawiony. Wróćmy do edytora SQL (F12), a następnie zatwierdźmy zlecenie SQL wysłane za pomocą przycisku [Commit]:

Image

Po wykonaniu tej czynności wróćmy do tabeli [ARTICLES]. Możemy zauważyć, że nic się nie zmieniło, nawet po użyciu przycisku [Refresh]:

Image

Powyżej otwórzmy kartę [Fields], a następnie wróćmy do karty [Data]. Tym razem wstawiony wiersz wyświetla się poprawnie:

Image

Gdy rozpoczyna się wysyłanie poszczególnych poleceń SQL, edytor otwiera w bazie tzw. transakcję. Zmiany wprowadzone przez te polecenia SQL w edytorze SQL będą widoczne tylko tak długo, jak długo pozostajemy w tym samym edytorze SQL (można otworzyć kilka edytorów). Wszystko przebiega tak, jakby edytor SQL pracował nie na rzeczywistej bazie danych, ale na własnej kopii. W rzeczywistości nie dzieje się to dokładnie w ten sposób, ale ten obraz może pomóc nam zrozumieć pojęcie transakcji. Wszystkie zmiany wprowadzone w kopii w trakcie transakcji będą widoczne w rzeczywistej bazie danych dopiero po ich zatwierdzeniu za pomocą operacji [Commit Transaction]. Wówczas bieżąca transakcja zostaje zakończona i rozpoczyna się nowa transakcja.

Zmiany wprowadzone w trakcie transakcji można cofnąć za pomocą operacji o nazwie [Rollback]. Przeprowadźmy następujący eksperyment. Rozpocznijmy nową transakcję (wystarczy wykonać [Commit] na bieżącej transakcji) z następującym poleceniem SQL:

Image

Wykonajmy to polecenie, które usuwa wszystkie wiersze z tabeli [ARTICLES], a następnie wykonajmy [New Query], czyli nowe polecenie SQL:

Image

Otrzymujemy następujący wynik:

Image

Wszystkie wiersze zostały usunięte. Przypomnijmy, że operacja ta została przeprowadzona na kopii tabeli [ARTICLES]. Aby to sprawdzić, kliknijmy dwukrotnie na tabelę [ARTICLES] poniżej:

Image

i wyświetlmy zakładkę [Data]:

Image

Nawet po użyciu przycisku [Refresh] lub przejściu do zakładki [Fields], a następnie powrocie do zakładki [Data], powyższa zawartość pozostaje niezmieniona. Zostało to już wyjaśnione. Znajdujemy się w innej transakcji, która działa na własnej kopii. Teraz wróćmy do edytora SQL (F12) i użyjmy przycisku [RollBack], aby cofnąć usunięcia wierszy, które zostały wykonane:

Image

Zostaniemy poproszeni o potwierdzenie:

Image

Potwierdzamy. Edytor SQL potwierdza, że zmiany zostały cofnięte:

Image

W celu weryfikacji ponownie uruchommy powyższe zapytanie SQL. Znajdujemy w nim wiersze, które zostały usunięte:

Image

Operacja [Rollback] przywróciła kopię, nad którą pracuje edytor SQL, do stanu, w jakim znajdowała się na początku transakcji.