Park Stołeczny, Emanuel Śmigło, 24.03.2012 r. o 04:21
Kącik Kodera V

W piątym wydaniu KK postaram się przybliżyć bardziej zaawansowane lub po prostu mniej znane funkcjonalności jakie oferuje nam SQL. Artykuł będzie dotyczył doczesnej wersji MySQL. Będzie trochę nerdowsko.

Widoki
Widoki (ang. views) to wirtualne tabele, które przedstawiają wynik zapytania SELECT. Dla przykładu: spójrzmy na sarmackie podwórko. Mieszkaniec jest w relacji wiele-do-wielu z instytucjami. Jeden mieszkaniec może być właścicielem wielu podmiotów oraz jeden podmiot może mieć wielu stronników. Zapytanie zwracające listę instytucji, których właścicielem jest dany mieszkaniec będzie musiało złączyć trzy tabele: mieszkańcy, członkostwa oraz instytucje. Bez widoku będziemy musieli zawrzeć całe zapytanie w skrypcie. Jeżeli wykorzystamy to zapytanie do stworzenia widoku zyskami kilka rzeczy:
1) Zmniejszymy objętość zapytania (odpytamy sam widok).
2) Ukryjemy dostęp do tabel bazowych definiując własny interfejs tylko do odczytu.
3) Zapewnimy kompatybilność wstecz w przypadku zmiany struktury bazy danych w przyszłości - wystarczy zaktualizować treści zapytań widoków zamiast dokonywać modyfikacji kodu aplikacji klienckich.

Ponadto widoki mogą przechowywać kolumny powstałe z wyników funkcji agregujących - coś czego nie powinniśmy przechowywać w zwykłych tabelach.

Wyzwalacze
Wyzwalacze (ang. triggers) pozwalają nam zdefiniować funkcjonalność, która będzie uruchamiana w zadanych okolicznościach. Musimy określić moment uruchomienia (przed albo po) oraz operację sprawczą (INSERT, UPDATE bądź DELETE). Dobrym przykładem może być przypisanie wartości dla zadanych pól w wierszu przed jego dodaniem do tabeli. MySQL nie pozwala na stosowanie wyników funkcji np. NOW() czy CURDATE() jako wartości domyślnych. Możemy obejść to obostrzenie tworząc wyzwalacz o treści:

CREATE TRIGGER nasz_wyzwalacz BEFORE INSERT ON nasza_tabela
FOR EACH ROW
BEGIN
IF NEW.data_wpisu IS NULL THEN
    SET NEW.data_wpisu = CURDATE();
END IF;
END

Efektem będzie przypisanie polu data_wpisu wartości w przypadku jej braku przed dodaniem wiersza do tabeli. Już nie musimy troszczyć się o to przy poleceniu INSERT. Chłodna historia, ale nie ma róży bez kolców. Czas wykonania operacji wydłuży się o czas działania wyzwalacza. Jeżeli w naszej aplikacji będziemy przeprowadzać częste INSERTy dużej ilości wierszy to zapewne stracimy nieco wydajności w porównaniu z jawnym uzupełnianiem wartości pola. Ponadto działanie wyzwalacza jest transparentne dla aplikacji klienckich co może komplikować wykrywanie błędów.

Dla zainteresowanych polecam stronę http://www.mysqltutorial.org/. W kolejnym odcinku ciąg dalszy tematyki z kursorami i procedurami, być może. Dziurawego kodu!
Dotacje
0,00 lt
Nikt jeszcze nie zasponsorował tego artykułu.
Serduszka
0,00 lt
Nikt jeszcze nie lubi tego artykułu.
Komentarze
György Róni Karakachanow Jr
Nic nie zrozumiałem, ale polecam!
Permalink
Markus Arped
Jak Grigorij poleca, to ja też polecam!
Odpowiedz Permalink
Avril von Levengothon
Piękne :* Cudne :* Idealne :* Zrozumiałem wszystko a nawet więcej.
Odpowiedz Permalink
Ignacy Urban de Ruth
Mi bliżej do Grigorija niż Avrila, ale tantiem się należy :P
Odpowiedz Permalink
Przemysław Provenzano
ⱠⱠ
Permalink

Musisz się zalogować, by móc dodawać komentarze.