E.14 Bazy Danych cz. 18 SQL Funkcje, procedury składowane i wyzwalacze

Podobne dokumenty
Przykład 3 Zdefiniuj w bazie danych hurtownia_nazwisko przykładową funkcję użytkownika fn_rok;

Wyzwalacze (triggery) Przykład

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

Plan bazy: Kod zakładający bazę danych: DROP TABLE noclegi CASCADE; CREATE TABLE noclegi( id_noclegu SERIAL NOT NULL,

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Wykład 5 funkcje i procedury pamiętane widoki (perspektywy) wyzwalacze

PODSTAWY BAZ DANYCH 13. PL/SQL

Wyzwalacze. do automatycznego generowania wartości kluczy głównych. Składnia instrukcji tworzacej wyzwalacz

Instrukcja podwaja zarobki osób, których imiona zaczynają się P i dalsze litery alfabetu zakładamy, że takich osbób jest kilkanaście.

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

Składowane procedury i funkcje

Hurtownia Świętego Mikołaja projekt bazy danych

Wykład 8. SQL praca z tabelami 5

SQL 4 Structured Query Lenguage

Bloki anonimowe w PL/SQL

Procedury wyzwalane. (c) Instytut Informatyki Politechniki Poznańskiej 1

Trigger jest obiektem związanym z tablicą, który aktywuje się gdy do tablicy następuje odpowiednie zapytanie.

BAZA DANYCH SIECI HOTELI

Bazy Danych i Usługi Sieciowe

Wyzwalacze. Anna Fiedorowicz Bazy danych 2

Bazy danych 11. SQL Procedury składowane, kursory i wyzwalacze

Używany kiedy pełna treść instrukcji SQL jest nieznana przed uruchomieniem programu.

Wprowadzenie. Tworzenie widoków

Wykład 5. SQL praca z tabelami 2

SQL Server i T-SQL w mgnieniu oka : opanuj język zapytań w 10 minut dziennie / Ben Forta. Gliwice, Spis treści

Bazy danych 10. SQL Widoki

Bazy danych 9. SQL Klucze obce Transakcje

Bazy danych i usługi sieciowe

Programowanie po stronie serwera w SZBD. Robert A. Kłopotek Wydział Matematyczno-Przyrodniczy. Szkoła Nauk Ścisłych, UKSW

Literatura: SQL Ćwiczenia praktyczne Autor: Marcin Lis Wydawnictwo: Helion. Autor: Joanna Karwowska

Cele. Definiowanie wyzwalaczy

Bazy danych 6. Klucze obce. P. F. Góra

Administracja i programowanie pod Microsoft SQL Server 2000

Pakiety są logicznymi zbiorami obiektów takich jak podprogramy, typy, zmienne, kursory, wyjątki.

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Cheatsheet PL/SQL Andrzej Klusiewicz 1/9

Bazy danych 8. Widoki i wyzwalacze. P. F. Góra

SQL :: Data Definition Language

INTERNETOWE BAZY DANYCH materiały pomocnicze - wykład X

Aspekty aktywne baz danych

15. Funkcje i procedury składowane PL/SQL

1. Wyzwalacze BD (ang. triggers)

CREATE TABLE autorzy ( id_autora SERIAL PRIMARY KEY, imie TEXT, nazwisko TEXT );

Bazy danych wykład szósty Więzy i wyzwalacze. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

Struktura bazy danych

E.14 Bazy Danych cz. 17 SQL Widoki

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

3 Przygotowali: mgr inż. Barbara Łukawska, mgr inż. Maciej Lasota

Oracle PL/SQL. Paweł Rajba.

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Kowalski Marcin Wrocław, dn Jaśkiewicz Kamil Bazy Danych 1 Podstawy Projekt Temat: Baza danych do zarządzania projektami

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Pakiety podprogramów Dynamiczny SQL

Zaawansowane bazy danych i hurtownie danych semestr I

Procedury i funkcje składowane

Rozdział 17. Zarządzanie współbieżnością zadania dodatkowe

Bazy danych 7. SQL podstawy

PL/SQL. Zaawansowane tematy PL/SQL. Piotr Medoń

Język SQL, zajęcia nr 1

Relacyjne bazy danych. Podstawy SQL

Projektowanie systemów baz danych

Transakcje W poprzednich częściach instrukcje języka SQL traktowane były jak indywidualne operacje (transakcje)

Bazy danych 8. Procedury składowane i kursory. P. F. Góra

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

Sprawdzenie poziomu izolacji transakcji (w aktualnym połączeniu):

Wykład 05 Bazy danych

Wprowadzenie do projektowania i wykorzystania baz danych Relacje

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ];

Przykłady najlepiej wykonywać od razu na bazie i eksperymentować z nimi.

Język PL/SQL Procedury i funkcje składowane

T-SQL dla każdego / Alison Balter. Gliwice, cop Spis treści. O autorce 11. Dedykacja 12. Podziękowania 12. Wstęp 15

Wprowadzenie do BD Operacje na bazie i tabelach Co poza zapytaniami? Algebra relacji. Bazy Danych i Systemy informacyjne Wykład 2.

BAZY DANYCH Cz III. Transakcje, Triggery

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

Relacyjne bazy danych. Podstawy SQL

Materiały. Technologie baz danych. Plan wykładu Kursory. Wykład 5: Kursory jawne. Podprogramy. Kursory jawne. Kursory niejawne

Imię i Nazwisko Data Ocena. Laboratorium 7

LAB 6 BEGIN TRANSACTION, COMMIT, ROLLBACK, SET TRANSACTION ISOLATION LEVEL,

Język PL/SQL. Rozdział 5. Pakiety podprogramów. Dynamiczny SQL

Post-relacyjne bazy danych

Bazy danych wykład dwunasty PL/SQL, c.d. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

Bazy danych 7. Widoki i wyzwalacze. P. F. Góra

Bazy danych programowanie Wykład dla studentów matematyk

Język DML. Instrukcje DML w różnych implementacjach SQL są bardzo podobne. Podstawowymi instrukcjami DML są: SELECT INSERT UPDATE DELETE

Administracja i programowanie pod Microsoft SQL Server 2000

Plan wykładu BAZY DANYCH II WYKŁAD 8. Wyzwalacze. Wyzwalacze

Bazy danych 9. Klucze obce Transakcje

Bazy danych 9. Klucze obce Transakcje. P. F. Góra

Systemowe aspekty baz danych

Bartosz Jachnik - Kino

Obsługa błędów w SQL i transakcje. Obsługa błędów w SQL

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

Bazy danych - Materiały do laboratoriów VIII

E.14 Bazy Danych cz. 15 SQL Transakcyjne przetwarzanie danych

1: 2: 3: 4: 5: 6: 7: 8: 9: 10:

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów

Wyzwalacze TWORZENIE WYZWALACZY

Transkrypt:

Funkcje użytkownika Tworzenie funkcji Usuwanie funkcji Procedury składowane Tworzenie procedur składowanych Usuwanie procedur składowanych Wyzwalacze Wyzwalacze a ograniczenia i procedury składowane Tworzenie wyzwalaczy Usuwanie wyzwalaczy Na podstawie: webmaster.helion.pl oraz: ihelp.ovh.org Oprócz tabel i widoków w bazach danych możemy tworzyć własne funkcje, procedury i specjalny typ procedur, które będą automatycznie wywoływanie przez MySQL w memencie wstawiania, usuwania lub modyfikowania określonych danych, czyli wyzwalacze. W tym odcinku dowiesz się, jak tworzyć i jak korzystać z tego typu obiektów. Funkcje użytkownika Jedną z możliwości MySQL-a jest możliwość tworzenia przez użytkowników własnych funkcji. Funkcjom, tak jak procedurom, można przekazać pewną liczbę parametrów, ale funkcja nie tylko wykonuje pewne operacje, ale także zwraca obliczony na podstawie przekazanych parametrów wynik. Tworzenie funkcji Wykonanie instrukcji CREATE FUNCTION spowoduje utworzenie funkcji użytkownika. Funkcja z listingu 18.1 oczekuje na jeden parametr datę i zwraca odczytany z tej daty rok. Listing 18.1. Przykładowa funkcja użytkownika i sposób jej wywołania CREATE FUNCTION fn_data (data DATE) RETURNS CHAR(20) RETURN YEAR(data); Query OK, 0 rows affected (0.01 sec) SELECT fn_data('2001-1-1'); +---------------------+ fn_data('2001-1-1') +---------------------+ 2001 +---------------------+ 1

Osoby znające inne proceduralne języki programowania prawdopodobnie rozpoznają pewne podobieństwa w tworzeniu funkcji w każdym przypadku trzeba zdefiniować nagłówek (nazwę, listę argumentów i typ zwracanej wartości) i ciało funkcji. Ostatnią instrukcją ciała funkcji powinna być instrukcja RETURN. Funkcja zwróci wartości wymienione po prawej stronie tej instrukcji. Kolejny przykład pokazuje nieco zmienioną wersję naszej funkcji. Tym razem funkcja oczekuje na dwa parametry i zwraca rok i nazwę miesiąca oddzielone podanym znakiem (listing 18.2). Listing 18.2. Rozbudowana funkcja i jej wywołanie w ramach instrukcji odczytującej dane z tabeli CREATE FUNCTION fn_daty (data date, delimeter char(1)) RETURNS char(20) RETURN CONCAT(YEAR(data),delimeter, MONTHNAME(data)); Query OK, 0 rows affected (0.00 sec) SELECT date_placed, fn_daty(date_placed,':') FROM orderinfo; +-------------+--------------------------+ date_placed fn_daty(date_placed,':') +-------------+--------------------------+ 2000-03-13 2000:March 2000-06-23 2000:June 2000-09-02 2000:September 2000-09-03 2000:September 2000-07-21 2000:July +-------------+--------------------------+ Usuwanie funkcji Wykonanie instrukcji DROP FUNCTION spowoduje usunięcie wybranych funkcji użytkownika (listing 18.3). Listing 18.3. Administrator albo osoba mająca nadane odpowiednie uprawnienia może usuwać funkcje użytkownika z bazy DROP FUNCTION fn_data; Query OK, 0 rows affected (0.00 sec) Procedury składowane Procedury składowane są zbiorami instrukcji języka SQL zapisanymi pod wspólną nazwą i wywoływanymi jak pojedyncza instrukcja. Procedury składowane umożliwiają: 1. Przekazywanie parametrów wywołania. 2

2. Wykonywanie prawie wszystkich instrukcji języka SQL, w tym wywoływania innych procedur składowanych. 3. Zwracanie dowolnej liczby wyników do programu, który wywołał procedurę. 4. Zwracanie informacji o udanej lub niewykonanej procedurze. Procedury składowane są powszechnie wykorzystywane w celu: 1. implementowania reguł logiki biznesowej, 2. zabezpieczenia obiektów bazy danych przed bezpośrednim dostępem użytkowników, 3. chronienia bazy danych przed atakami polegającymi na iniekcji kodu SQL, 4. poprawienia wydajności często wykonywanych instrukcji, 5. zminimalizowania obciążenia sieci (zamiast wysyłać całe instrukcje języka SQL użytkownik wywołuje jedynie procedurę, wysyłając jej nazwę i przekazując parametry jej wywołania). Tworzenie procedur składowanych Wykonanie instrukcji CREATE PROCEDURE spowoduje dodanie nowej procedury składowanej (listing 18.4). Listing 18.4. W tym przypadku ciało procedury składa się z pojedynczej instrukcji, a więc nie trzeba było umieszczać jej w bloku BEGIN END. Przykładowa procedura oczekuje na jeden parametr wywołania i nie zwraca żadnych informacji CREATE PROCEDURE przecena (IN nazwa varchar (64)) UPDATE item SET sell_price = sell_price*0.9 WHERE description = nazwa; Query OK, 0 rows affected (0.01 sec) SELECT description, sell_price FROM item WHERE description LIKE 'f%'; description sell_price Fan Small 8.86 Fan Large 11.22 CALL przecena ('Fan Small'); Query OK, 1 row affected, 1 warning (0.03 sec) SELECT description, sell_price FROM item 3

WHERE description LIKE 'f%'; description sell_price Fan Small 7.97 Fan Large 11.22 Usuwanie procedur składowanych Nieużywane procedury składowane możemy usunąć poprzez instrukcję DROP PROCEDURE (listing 18.5). Listing 18.5. Usuwamy procedurę składowaną DROP PROCEDURE przecena; Query OK, 0 rows affected (0.00 sec) Wyzwalacze Wyzwalacze są specjalnym typem procedur składowanych powiązanych z wybranymi tabelami i wywoływanych wykonaniem instrukcji języka SQL: INSERT, UPDATE albo DELETE. Niemożliwe jest bezpośrednie wywołanie wyzwalacza za pomocą dyrektywy CALL. Instrukcje wykonane w ramach ciała wyzwalacza traktowane są jako fragment transakcji jawnie lub niejawnie rozpoczętej przez użytkownika, który odwołał się do danych przechowywanych w powiązanej z wyzwalaczem tabeli. Wynika z tego, że wyzwalacz może zatwierdzić (wykonując instrukcję COMMIT TRANSACTION) lub wycofać (instrukcją ROLLBACK TRANSACTION) zmiany wprowadzone przez użytkownika. Podstawowym zastosowaniem wyzwalaczy jest wymuszenie integralności danych, zwłaszcza ich zgodności z regułami logiki biznesowej. Wyzwalacze umożliwiają m.in.: 1. Kaskadowe aktualizowanie danych w powiązanych tabelach. 2. Sprawdzanie poprawności danych na podstawie wartości przechowywanych w dowolnych tabelach (w przeciwieństwie do zawężenia CHECK, za pomocą którego możemy odwołać się jedynie do bieżącej tabeli). 3. Jednoczesne sprawdzanie danych zmodyfikowanych w dowolnej liczbie wierszy tabeli. 4. Wywoływanie predefiniowanych lub zdefiniowanych przez użytkownika komunikatów błędu. 5. Monitorowanie aktywności użytkowników. 6. Modyfikacje danych w bazach niespełniających wymogów trzeciej postaci normalnej. W bazach tego typu prawdopodobnie przechowywane są informacje nadmiarowe (redundantne) i modyfikacja np. numeru telefonu w jednej tabeli może wiązać się z koniecznością zmiany tego numeru w innych tabelach. 4

Wyzwalacze a ograniczenia i procedury składowane Obiekty obu tych typów w pewnym podstawowym zakresie mogą pełnić tę samą funkcję wymuszenia integralności przechowywanych danych. Jednak zakres i typ przeprowadzanych przez nie akcji są różne: 1. Wyzwalacze w przeciwieństwie do ograniczeń wywoływane są w odpowiedzi na akcje użytkownika. Wynika z tego, że dopiero po wykonaniu instrukcji wyzwalany jest wyzwalacz, natomiast warunki ograniczeń sprawdzane są przed wykonaniem instrukcji języka SQL. 2. Konsekwencją poprzedniego punktu jest kolejność, w jakiej wywoływane są wyzwalacze i ograniczenia najpierw sprawdzane są warunki zdefiniowane w ograniczeniach, a po ich pomyślnym sprawdzeniu wywoływany jest wyzwalacz. 3. Wyłącznie właściciel tabeli może utworzyć powiązany z nią wyzwalacz. Uprawnienie do tworzenia wyzwalaczy nie może zostać nikomu nadane czy przekazane. 4. Wyzwalacze nie mogą zostać powiązane z widokami oraz tabelami tymczasowymi. 5. Wyzwalacze mogą przetwarzać jednocześnie wiele wierszy tabeli. Możliwe jest również warunkowe przetwarzanie poszczególnych wierszy. Tak jak możliwe jest zdefiniowanie dla tabeli dowolnej liczby zawężeń (wyjątkiem jest ograniczenie PRIMARY KEY), możliwe jest również utworzenie dowolnej liczby powiązanych z nią wyzwalaczy. Natomiast tym, co odróżnia wyzwalacze od procedur składowanych (oprócz sposobu ich wywoływania) jest fakt, że wyzwalacze z reguły nie zwracają żadnych danych. Tworzenie wyzwalaczy Aby utworzyć wyzwalacz, należy wykonać instrukcję CREATE TRIGGER. W tym punkcie przyjrzymy się wykorzystaniu wyzwalaczy do monitorowania zmian nazw produktów. W pierwszej kolejności utworzymy tabelę, w której będziemy przechowywać historię nazw produktów (listing 18.6). Listing 18.6. Tworzymy tabelę pomocniczą, w której wyzwalacz automatycznie będzie zapisywał interesujące nas dane CREATE TABLE dziennik( id int auto_increment primary key, komunikat varchar(255)); Query OK, 0 rows affected (0.10 sec) Następnie tworzymy wyzwalacz uruchamiany instrukcją UPDATE wykonaną dla tabeli item, w ramach którego: 1. Sprawdzamy, czy została zmieniona nazwa produktu. 2. Sprawdzamy, czy nowa albo stara nazwa produktu nie jest nieokreślona. 3. Jeżeli któryś z tych warunków jest spełniony, wstawiamy do tabeli dziennik wiersz z oryginalną i zmienioną nazwą produktu (listing 18.7). 5

Ponieważ w ciele wyzwalacza poszczególne instrukcje oddziela znak średnika, na czas jego tworzenia należy zmienić znak końca instrukcji inaczej zostanie on natychmiast zinterpretowany, a nie zapisany jako fragment ciała wyzwalacza. Listing 18.7. Wyzwalacz zapisujący historię zmian nazw produktów DELIMITER // CREATE TRIGGER tgr_nazwy BEFORE UPDATE ON item FOR EACH ROW BEGIN IF new.description!= old.description OR new.description is null and old.description is not null OR old.description is null and new.description is not null then INSERT INTO dziennik(komunikat) VALUES ( CONCAT('nazwa: ', COALESCE(old.description,'NULL'), ' -> ', COALESCE(new.description,'NULL')) ); END IF; END;// Query OK, 0 rows affected (0.16 sec) Jak wynika z analizy kodu wyzwalacza, w specjalnej tabeli systemowej OLD przechowywane są oryginalne wartości, a w tabeli NEW wartości zmienione przez użytkownika. Przetestujmy nasze rozwiązanie (listing 18.8). Listing 18.8. Jakakolwiek zmiana nazwy produktu zostanie odnotowana UPDATE item SET description = 'Linux DVD' WHERE item_id=3; Query OK, 1 row affected (0.03 sec) Rows matched: 1 Changed: 1 Warnings: 0 SELECT * FROM dziennik; +----+------------------------------+ id komunikat +----+------------------------------+ 1 nazwa: Linux CD -> Linux DVD +----+------------------------------+ 6

Usuwanie wyzwalaczy Aby usunąć wyzwalacz, należy wykonać instrukcję DROP TRIGGER (listing 18.9). Listing 18.9. Usuwamy przykładowy wyzwalacz DROP TRIGGER tgr_nazwy; Query OK, 0 rows affected (0.04 sec) 7