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

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

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

Wyzwalacze (triggery) Przykład

DECLARE VARIABLE zmienna1 typ danych; BEGIN

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

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

Wykład 8. SQL praca z tabelami 5

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

PODSTAWY BAZ DANYCH 13. PL/SQL

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

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

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

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

SQL 4 Structured Query Lenguage

Składowane procedury i funkcje

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

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

15. Funkcje i procedury składowane PL/SQL

Bloki anonimowe w PL/SQL

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

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

BAZA DANYCH SIECI HOTELI

Język SQL, zajęcia nr 1

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

Hurtownia Świętego Mikołaja projekt bazy danych

CREATE DATABASE ksiegarnia_internetowa DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

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

Aspekty aktywne baz danych

Projektowanie systemów baz danych

Struktura bazy danych

Bazy Danych i Usługi Sieciowe

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

Administracja i programowanie pod Microsoft SQL Server 2000

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

Cheatsheet PL/SQL Andrzej Klusiewicz 1/9

Cele. Definiowanie wyzwalaczy

Zaawansowane bazy danych i hurtownie danych semestr I

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

Autor: Joanna Karwowska

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

SQL :: Data Definition Language

Bazy danych i usługi sieciowe

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

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

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

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

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

Wyzwalacze. Anna Fiedorowicz Bazy danych 2

1. Wyzwalacze BD (ang. triggers)

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

Wykład 05 Bazy danych

Procedury i funkcje składowane

BAZY DANYCH Cz III. Transakcje, Triggery

1. Połączenie z bazą danych. W wybranym edytorze tworzymy plik sqltest.py i umieszczamy w nim poniższy kod. #!/usr/bin/python3 import sqlite3

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

Bazy danych. Polecenia SQL

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

Pakiety podprogramów Dynamiczny SQL

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

Oracle PL/SQL. Paweł Rajba.

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8

Programowanie MSQL. show databases; - pokazanie jakie bazy danych są dostępne na koncie

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

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

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

Tworzenie tabel. Bazy danych - laboratorium, Hanna Kleban 1

41. Zmienne lokalne muszą mieć nazwę, którą poprzedza (maksymalnie 128 znaków) oraz typ (każdy z wyjątkiem: text, ntext oraz image)

Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski.

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

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

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

Autor: Joanna Karwowska

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

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

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

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

PL/SQL. Zaawansowane tematy PL/SQL

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

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

Bazy danych. dr inż. Arkadiusz Mirakowski

Wprowadzenie do projektowania i wykorzystania baz danych Relacje

1. Tworzenie tabeli. 2. Umieszczanie danych w tabeli

Aby uruchomić program klienta i połączyć się z serwerem, należy komendę:

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

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

Wyzwalacze TWORZENIE WYZWALACZY

Relacyjne bazy danych. Podstawy SQL

Bazy danych 10. SQL Widoki

Ref. 7 - Język SQL - polecenia DDL i DML

CREATE USER

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

Administracja i programowanie pod Microsoft SQL Server 2000

Wykład 4. SQL praca z tabelami 1

Obowiązuje od wersji

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

Odnawialne Źródła Energii I rok. Tutorial PostgreSQL

Struktura drzewa w MySQL. Michał Tyszczenko

Tworzenie tabeli przez select CREATE TABLE PRAC2 AS SELECT P.NAZWISKO, Z.NAZWA FROM PRAC P NATURAL JOIN ZESP Z

Transkrypt:

Temat: Funkcje, procedury i wyzwalacze. 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. 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. Funkcje w MySQL, różnią się od procedur tym, że nie muszą być wskazywane parametry wejścia i wyjścia ponadto funkcja zwraca jakiś typ danych z dostępnych w MySQL. Tworzenie funkcji Wykonanie instrukcji CREATE FUNCTION spowoduje utworzenie funkcji użytkownika. Funkcja z przykładu 3 oczekuje na jeden parametr datę i zwraca odczytany z tej daty rok. Przykład 1 Uaktywnij bazę danych hurtownia_nazwisko. Zdefiniuj w niej przykładową funkcję fn_powitanie, która wyświetli napis Witaj! Ponieważ w ciele funkcji poszczególne instrukcje oddziela znak średnika, na czas jej tworzenia należy zmienić znak końca instrukcji inaczej zostanie on natychmiast zinterpretowany, a nie zapisany jako fragment ciała funkcji. np. DELIMITER // Wywołaj funkcję poleceniem: SELECT fn_powitanie(); Przykład 2 Funkcja z parametrem (imie). Zdefiniuj funkcje fn_powitanie2, która oprócz słowa Witaj! Wyświetli jeszcze imię klienta (w bazie danych hurtownia_nazwisko masz tabelę klienci, a nie pracownicy!). Przykład 3 Zdefiniuj w bazie danych hurtownia_nazwisko przykładową funkcję użytkownika fn_rok; CREATE FUNCTION fn_rok (data DATE) RETURNS CHAR(20) DETERMINISTIC RETURN YEAR(data); Wywołaj funkcję poleceniem: SELECT fn_rok( 2013-11-12 ) ; 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. Ćwiczenie 1 Utwórz funkcję fn_miesiac, która zwróci miesiąc (w języku angielskim) z podanej daty. Przykład 4 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. CREATE FUNCTION fn_daty (data DATE, dwukropek CHAR(1)) RETURNS CHAR(20) DETERMINISTIC RETURN CONCAT(data, dwukropek, MONTHNAME(data)) // Wywołaj funkcję poleceniem: SELECT fn_daty(data, : ) FROM zamowienia // Funkcja zwróci następujący wynik: Ćwiczenie 2 Zmodyfikuj funkcję fn_daty w ten sposób, aby zwracała jeszcze nazwę dnia tygodnia z podanej daty. Usuwanie funkcji Wykonanie instrukcji DROP FUNCTION spowoduje usunięcie wybranych funkcji użytkownika. Administrator albo osoba mająca nadane odpowiednie uprawnienia może usuwać funkcje użytkownika z bazy: DROP FUNCTION nazwa_funkcji; lub DROP FUNCTION IF EXISTS nazwa_funkcji; Wyświetlenie kodu funkcji Celem wyświetlenia kodu funkcji lub procedury należy użyć polecenia: SHOW CREATE FUNCTION nazwa_funkcji; 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. 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. 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. Przykład 5 Utwórz procedurę przecena, która spowoduje obniżkę cen wybranego towaru o 10%. DELIMITER ; (zmiana znaku końca instrukcji na ;) CREATE PROCEDURE przecena (IN towar VARCHAR(64)) (IN wejście) UPDATE towary SET cena=cena*0.9 WHERE nazwa=towar; Wybierzmy do przeceny jeden z towarów o nazwie zaczynającej się na literę p np. Panele. Uruchamiamy funkcję poleceniem: CALL nazwa_funkcji(argument); CALL przecena ( Panele ); i sprawdzamy czy zmieniła się cena towaru Panele. W procedurach w MySQL możemy stosować instrukcje warunkowe takie jak IF. Przykład 6 Utwórz procedurę, która sprawdzi czy podana liczba jest mniejsza od 10. Jeśli tak, to wyświetli się komunikat mniejsza niż 10, a jeśli nie to wyświetli się większa lub równa 10. Usuwanie procedur składowanych Nieużywane procedury składowane możemy usunąć poprzez instrukcję DROP PROCEDURE. Usuwamy procedurę składowaną: DROP PROCEDURE nazwa_procedury; lub DROP PROCEDURE IF EXISTS nazwa_procedury; Wyświetlenie kodu procedury Celem wyświetlenia kodu procedury należy użyć polecenia: SHOW CREATE PROCEDURE nazwa_procedury;

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. 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. 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) ); Następnie tworzymy wyzwalacz uruchamiany instrukcją UPDATE wykonaną dla tabeli towary, 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. 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. Przykład 7: Wyzwalacz zapisujący historię zmian nazw produktów DELIMITER // CREATE TRIGGER tgr_nazwy BEFORE UPDATE ON towary FOR EACH ROW BEGIN (przed aktualizacją w tabeli towary) (dla każdego wiersza) IF new.nazwa!= old.nazwa (nowa nazwa jest różna od starej nazwy) OR new.nazwa IS NULL AND old.nazwa IS NOT NULL (lub nowa nazwa jest NULL a stara nazwa nie jest NULL) OR old.nazwa IS NULL And new.nazwa IS NOT NULL THEN (lub stara nazwa jest NULL a nowa nazwa nie jest NULL) INSERT INTO dziennik(komunikat) (wstaw do tabeli dziennik pole komunikat) VALUES (CONCAT('nazwa: ', COALESCE(old.nazwa, 'NULL'), ' -> ', COALESCE(new.nazwa, 'NULL')) ); END IF; END;// 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. Jakakolwiek zmiana nazwy produktu zostanie odnotowana w tabeli dziennik. UPDATE towary SET nazwa = 'Srubki' WHERE id=1; Przeprowadź kilka zmian nazw towarów i wyświetl zawartość tabeli dziennik. SELECT * FROM dziennik; Usuwanie wyzwalaczy Aby usunąć wyzwalacz, należy wykonać instrukcję DROP TRIGGER. DROP TRIGGER nazwa_wyzwalacza; Ćwiczenie 3 Przepisz do zeszytu temat i zrób notatkę z lekcji. Ćwiczenie 4 Do tabeli pracownicy dodaj nowe pole plec (K lub M) i wypełnij je danymi. Utwórz wyzwalacz(sprawdz_plec), który uruchamiany będzie w trakcie wykonywania operacji UPDATE. Wyzwalacz uruchomia funkcję (kontrola_plec), która będzie sprawdzała czy w kolumnie plec jest wpisana poprawna litera. Dokonaj modyfikacji jednego z rekordów, aby uruchomić wyzwalacz i sprawdzić jego działanie.

P7 Ćw.4 POWTÓRZENIE Zmienne lokalne mogą być deklarowana wewnątrz bloku BEGIN END przy użyciu instrukcji DECLARE. Przykład zmiennej w MySQL. W bazie danych firma_nazwisko utworzymy funkcję o nazwie fn_netto, która potrąci pracownikowi połowę pensji. CREATE FUNCTION fn_netto (pensja FLOAT) RETURNS FLOAT BEGIN DECLARE potracenia FLOAT DEFAULT 0.5; RETURN pensja * potracenia; END Po utworzeniu funkcji zastosuj ją do obniżenia pensji kierownika. Ćwiczenie 5 W bazie danych firma_nazwisko utwórz procedurę o nazwie WIEKSZA, która przy podaniu dwóch liczb, wyświetli większą z nich. Ćwiczenie 6 W bazie danych firma_nazwisko utwórz procedurę o nazwie TEST, która przy podaniu nazwy miasta jako parametru wyświetli pola imię i nazwisko osoby pochodzącej z danego miasta.

Ćwiczenie 7 W bazie danych firma_nazwisko utwórz procedurę o nazwie STANOWISKO, która przy podaniu nazwy stanowiska jako parametru wyświetli w jednym polu imię i nazwisko osoby pracującej na danym stanowisku. Ćwiczenie 8 W bazie danych firma_nazwisko utwórz procedurę o nazwie PODWYZKA, która przy podaniu nazwy stanowiska jako parametru podniesie o 50% pensję. Ćwiczenie 9 W bazie danych hurtownia_nazwisko utwórz procedurę o nazwie ZAMOWIENIA, która wyświetli ilość zamówień złożonych przez każdego klienta. Ćwiczenie 10 W bazie danych hurtownia_nazwisko utwórz procedurę o nazwie ZAMOWIENIA, która zwraca identyfikator klienta i identyfikator zamówienia.