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

Podobne dokumenty
Wyzwalacze (triggery) Przykład

Składowane procedury i funkcje

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

SQL 4 Structured Query Lenguage

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

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

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

DECLARE VARIABLE zmienna1 typ danych; BEGIN

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

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

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

PODSTAWY BAZ DANYCH 13. PL/SQL

CREATE USER

Cele. Definiowanie wyzwalaczy

Projektowanie systemów baz danych

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

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

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

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

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

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

SQL w języku PL/SQL. 2) Instrukcje języka definicji danych DDL DROP, CREATE, ALTER, GRANT, REVOKE

Transakcje jednocześnie ACID

Bloki anonimowe w PL/SQL

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

1. Wyzwalacze BD (ang. triggers)

Instalacja MySQL.

Wykład 8. SQL praca z tabelami 5

Wyzwalacze. Anna Fiedorowicz Bazy danych 2

Po instalacji serwera MYSQL dostępne jest konto o nazwie root. Domyślnie nie ma ono przypisanego hasła, aczkolwiek podczas procesu konfiguracji jest

BAZY DANYCH Cz III. Transakcje, Triggery

15. Funkcje i procedury składowane PL/SQL

Zaawansowane bazy danych i hurtownie danych semestr I

Zarządzanie bazą danych. Bazy Danych i Systemy informacyjne Wykład 4. Piotr Syga

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

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

Język SQL, zajęcia nr 1

PL/SQL. Zaawansowane tematy PL/SQL

mysql> UPDATE user SET Password=PASSWORD('pass') WHERE user='root'; Query OK, 2 rows affected (0.05 sec) Rows matched: 2 Changed: 2 Warnings: 0

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

Administracja i programowanie pod Microsoft SQL Server 2000

Bazy danych i usługi sieciowe

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

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

Wykład 5: PHP: praca z bazą danych MySQL

Uprawnienia, role, synonimy

Bazy Danych i Usługi Sieciowe

BAZA DANYCH SIECI HOTELI

SQL :: Data Definition Language

Cheatsheet PL/SQL Andrzej Klusiewicz 1/9

Struktura drzewa w MySQL. Michał Tyszczenko

PLAN WYKŁADU BAZY DANYCH PODSTAWOWE KWESTIE BEZPIECZEŃSTWA OGRANICZENIA DOSTĘPU DO DANYCH

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

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 6. Klucze obce. P. F. Góra

Oracle PL/SQL. Paweł Rajba.

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

1. Tworzenie tabeli. 2. Umieszczanie danych w tabeli

Wyzwalacze TWORZENIE WYZWALACZY

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

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

Wykład V. Indeksy. Struktura indeksu składa się z rekordów o dwóch polach

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

Ćwiczenia 2 IBM DB2 Data Studio

Instrukcje SQL można podzielić na pięć kategorii, które zostały przedstawione w poniższej tabeli.

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

SQL (ang. Structured Query Language)

77. Modelowanie bazy danych rodzaje połączeń relacyjnych, pojęcie klucza obcego.

ORACLE (Wykład 1) aragorn.pb.bialystok.pl/~aonisko. Typy rozproszonych baz danych. Systemy klient-serwer. Klient-serwer: Przykład

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

Język PL/SQL. Rozdział 6. Procedury wyzwalane

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Język SQL. Rozdział 9. Język definiowania danych DDL, część 2. zadania

Aspekty aktywne baz danych

Bazy danych. Bazy danych. Zapytania SELECT. Dr inż. Paweł Kasprowski.

Wprowadzenie do projektowania i wykorzystania baz danych Relacje

Wprowadzenie do projektowania i wykorzystania baz danych. Katarzyna Klessa

Plan wykładu BAZY DANYCH II WYKŁAD 3. Zasięg zmiennych. Zasięg zmiennych

P o d s t a w y j ę z y k a S Q L

PHP: bazy danych, SQL, AJAX i JSON

Procedury wyzwalane. Rozdział 13. Procedury wyzwalane. Cele stosowania procedur wyzwalanych. Definiowanie procedury wyzwalanej DML

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

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

Materiały do laboratorium MS ACCESS BASIC

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

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

Oracle PL/SQL. Paweł Rajba.

Plan. Formularz i jego typy. Tworzenie formularza. Co to jest formularz? Typy formularzy Tworzenie prostego formularza Budowa prostego formularza

Pakiety podprogramów Dynamiczny SQL

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

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

Systemowe aspekty baz danych

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

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

Procedury i funkcje składowane

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

Cwiczenie 7. Retrospekcja

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

Transkrypt:

Temat: Wyzwalacze (triggery). Trigger jest obiektem związanym z tablicą, który aktywuje się gdy do tablicy następuje odpowiednie zapytanie. W poniższym przykładzie definiujemy tablicę a następnie trigger związany z tą tablicą, który będzie uruchomiony w momencie wykonania polecenia INSERT (a właściwie tuż przed nim) wstawiającego dane do tej tablicy. Trigger oblicza sumę elementów jednego z pól tablicy we wszystkich rekordach. Przykład 1 Aby sprawdzić jak to działa, można wstawić do tablicy konto odpowiednie wartości i sprawdzić, jaka jest wartość zmiennej @sum. A zatem Widzimy, że trigger policzył sumę w polu ile z wszystkich wierszy 14.98 + 1937.50 100. Aby zniszczyć trigger, należy się posłużyć komendą DROP TRIGGER i użyć nazwy triggera razem z nazwą tablicy w notacji kropkowej. Po co są triggery? Dzięki triggerom możemy: DROP TRIGGER nazwa_tabeli.nazwa_wyzwalacza; Sprawdzać i zapobiegać dostawaniu się do bazy danych nieodpowiednich danych. Możemy zmieniać polecenia INSERT, UPDATE i DELETE lub w ogóle ich zaniechać w zależności od tego, jakie informacje dostarczy nam trigger. Możemy monitorować aktywność działań na danych w bazie danych w czasie sesji z bazą danych. Podczas definicji triggerów możemy używać tych samych wyrażeń, których używaliśmy przy definicji składowanych procedur i funkcji a w szczególności: słów BEGIN oraz END a zatem możemy używać struktur blokowych w triggerach. słów IF, CASE, WHILE, LOOP, REPEAT, LEAVE, ITERATE a zatem możemy sterować w sposób kontrolowany przepływem danych i dokonywać decyzji co dalej zrobi trigger. 1

słów DECLARE i SET, a zatem możemy deklarować i definiować zmienne, tak jak w procedurach i funkcjach. możemy deklarować uchwyty. Jak widzimy, w triggerach możemy prawie to samo co w funkcjach i procedurach. Triggery różnią się jednak od nich tym, że automatycznie są uruchamiane podczas wykonywania konkretnych zapytań do konkretnych tablic, umożliwiają zatem dość specyficzne ograniczanie dostępu do danych a jednocześnie normują sposób dostępu do danych w taki sposób jak tylko to zdefiniujemy. Tak samo, jak w przypadku funkcji, tak i w przypadku triggerów nie możemy używać podczas ich definicji następujących wyrażeń: START TRANSACTION, COMMIT, ROLLBACK a zatem nie możemy z poziomu triggerów definiować transakcji. Ponad to nie możemy z poziomu triggerów wykonywać procedur, które zwracają dane bezpośrednio do klienta (wykonującego procedurę). Możemy zatem wykonywać procedury tylko z parametrami OUT lub INOUT Jak definiujemy trigger? mysql> CREATE TRIGGER { BEFORE AFTER } { INSERT UPDATE DELETE } ON < tablica > FOR EACH ROW < specjalne_wyrażenie_sql > Triggery muszą mieć nazwę. Ich nazwa nie może być dłuższa niż 64 znaki, zatem przypominają pod tym względem inne obiekty w bazie danych (tablice, zmienne, procedury, itp). Triggery są nierozerwalnie związane z tablicami. Zatem w dalszej części wykładu o triggerach przyjęto konwencję, według której w nazwie triggera jest nazwa tablicy. Triggery uruchamiane są przed (ang. BEFORE (w skrócie B)) lub po (ang. AFTER (w skrócie A)) zadanym poleceniu, zatem dla szybkiej identyfikacji triggera do ich nazwy będzie zawsze dodawana literka B lub A. Ponad to triggery uruchamiane są w momencie wykonywania na tablicy konkretnego polecenie SQL (INSERT (w skrócie I), UPDATE (w skrócie U) lub DELETE (w skrócie D)) i w dalszej części wykładu do nazwy triggera będzie też dodawana odpowiednia litera w celu identyfikacji triggera. Przykłady tab1_bu nazwa triggera, który związany jest na stałe z tablicą tab1, i uruchamiany jest przed (b, before) wykonywaniem poleceń UPDATE (u). studenci_ad nazwa triggera, który związany jest na stałe z tablicą studenci i który uruchamiany jest po (a, after) wykonaniu na danych w tej tablicy poleceń DELETE (d, delete). towar_ai nazwa triggera, który związany jest na stałe z tablicą towar, i który uruchamiany jest po (a, after) wstawieniu danych do tej tablicy (i, INSERT). 2

Sprawa przywilejów Na dzień dzisiejszy, aby móc definiować triggery, należy posiadać przywilej SUPER, który można nadać tylko na poziomie globalnym (*.*). Wkrótce ma to ulec zmianie, i wówczas zostanie utworzony specjalny typ przywileju, na przykład CREATE TRIGGER. Wówczas można będzie nadać przywilej definiowania triggerów związanych z bazą danych i z konkretną tablicą w tej bazie, za pomocą takiego jak niżej polecenia: mysql> GRANT CREATE TRIGGER ON < tablica > TO < użytkownicy >; natomiast odebranie tych przywilejów będzie możliwe w taki mniej więcej sposób: mysql> REVOKE CREATE TRIGGER ON < tablica > FROM < użytkownicy >; W chwili obecnej jednak, aby móc definiować triggery trzeba mieć przywilej SUPER. Administrator musi więc wykonać dla nas następujące polecenie: Odnoszenie się do wartości OLD i NEW mysql> GRANT SUPER ON *.* TO user @ host'; Odnoszenie się do wartości pól poprzez zwyczajną nazwę pola może być w przypadku triggerów dwuznaczne. Nie wiadomo bowiem o którą wartośc chodzi w przypadku, kiedy nie wykonano jeszcze polecenia INSERT (bi BEFORE INSERT) a trigger już się uruchomił i może pracować na wszystkich wierszach (FOR EACH ROW) z tabeli. Analogicznie jest w przypadku usuwania rekordów i uruchamiania triggerów po wykonaniu polecenia DELETE. Zdefiniowano więc dwa słowa: OLD oraz NEW, które jasno definiują, o które dane nam chodzi. W przypadku poleceń INSERT możemy używać jedynie słowa NEW, w przypadku poleceń DELETE jedynie słowa OLD, natomiast w przypadku komend UPDATE, zarówno OLD jak i NEW. Przykład 2 Przykład użycia obydwu słów w poleceniu UPDATE. Najpierw trzeba utworzyć tabelę tab1. mysql> CREATE TABLE tab1 (s1, INT); 3

Jeśli tablica tab zawiera jeden wiersz z wartością 10 w polu s1 i wykonam polecenie UPDATE tab SET s1 = s1 + 1; wówczas, kiedy wykonywanie tego polecenia zostanie zakończone, zmienna @old zawierać będzie wartość 10, natomiast zmienna @new zawierać będzie wartość 11. Przykład 3 Utwórzmy prostą tabelę i zdefiniujmy związany z nią trigger. Tutaj, podobnie jak w przypadku procedur i funkcji należy najpierw zdefiniować znak końca polecenia, gdyż w innym wypadku, w przypadku złożonych triggerów, znak końca polecenia wewnątrz triggera może zostać zinterpretowany jako znak końca definicji triggera. Tutaj, we wszystkich przykładach poniżej, znakiem końca polecenia będzie podwójny ukośnik //. mysql> DELIMITER ; Tak zdefiniowany trigger jest skandalicznie prymitywny, jednak dla celów poznawczych powinien wystarczyć. Dygresja. W powyższej definicji triggera widzieliśmy użycie więcej niż jednej instrukcji SQL. Były one jednak objęte słowami BEGIN oraz END. Użycie takich słów umożliwia nam więc stosowanie więcej niż jednej instrukcji SQL. W takim bloku możemy też stosować dowolne inne wyrażenia, jak pętle czy instrukcje warunkowe, podobnie jak w przypadku procedur i funkcji. Więcej, bardziej rozbudowanych przykładów będzie dostępnych poniżej. Następnie, wstawmy rekord do tablicy tab. mysql> INSERT INTO tab VALUES(1); Osoba, która wstawia poleceniem INSERT wartości do tablicy, dla której zdefiniowane zostały triggery, nie musi wcale wiedzieć o istnieniu triggera. Osoba, która ma prawo wstawiać dane do tablicy, nie musi mieć prawa do definiowania triggerów, wystarczy, że nieświadomie wstawia dane do tablicy, a nasz trigger pracuje. 4

Zobaczmy co jest w tablicy i jakie wartości mają zmienne z triggera. Jak widać, zamiast wstawionej wartości 1 w tablicy znalazła się wartość 105. Ponadto, wartość zmiennej @azdefiniowanej podczas definiowania triggera, wynosi trigger włączony. Do tych zmiennych możemy odnosić się w czasie pracy z bazami danych, dlatego ich zawartość powinna być raczej czyszczona w definicji triggera, kiedy nie są już te zmienne potrzebne. Oczywiście, osoba, która ma prawo tylko do wykonywania poleceń SQL, nie zna najprawdopodobniej definicji triggera. Przykład 4 Zdefiniujemy trigger, który będzie sprawdzał wprowadzane zmiany w tablicy. Jeśli ktoś wykona polecenie UPDATE na danych w tablicy zdefiniowanej poniżej, wprowadzając dowolne zmiany, wówczas za każdym razem (dla każdego wiersza FOR EACH ROW) nowa wartość będzie sprawdzana i dopiero kiedy pomyślnie przejdzie testy zostanie zaakceptowana, w przeciwnym wypadku zostanie wprowadzona wartość z zakresu od 0 do 100. Użyjemy tablicy konto zdefiniowanej wcześniej, z wartościami wcześniej już wprowadzonymi. Jak widzimy, jeśli nowa wartość wprowadzana do tablicy w pole ile będzie mniejsza od zera, wówczas zostanie wprowadzona wartość równa 0, natomiast jeśli wartość prowadzana do tablicy w pole ile będzie większa od 100, wówczas do tablicy zostanie wprowadzona wartość równa 100. Sprawdźmy to. Najpierw spróbujmy zmienić wartości w polu ile we wszystkich rekordach wstawiając wartość mniejszą od zera, a następnie większą od 100. 5

Jak widzimy, trigger bardzo ładnie nam zadziałał sprawdzając wprowadzane nowe wartości i reagując odpowiednio. Przykład 5 Od wersji 5.1 MySQL możemy definiować triggery, w których bezpośrednio odnosimy się do tablic poleceniami INSERT, UPDATE i DELETE. W przykładzie poniżej najpierw definiujemy 4 tablice, następnie trigger związany z tablicą test1, w którym odwołujemy się do tych 4 tablic w sposób bezpośredni (wykonując polecenia INSERT, DELETE, UPDATE). Następnie wykonujemy polecenia INSERT wstawiając dane do tablic test3 oraz test4. Następnie spróbujemy wstawić dane do tablicy test1, z którą związaliśmy wyzwalacz test1_bi (wyzwalacz uruchamia się tuż przed wykonaniem polecenia INSERT). mysql> INSERT INTO test1 VALUES (1), (3), (1), (7), (1), (8), (4), (4); 6

Jako rezultat wykonania takiego polecenia w tablicach test1, test2, test3, test4 znajdą się następujące dane. 7