Wyzwalacze (triggery) Przykład

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

Składowane procedury i funkcje

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

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

SQL 4 Structured Query Lenguage

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

Bazy danych i usługi sieciowe

Bazy Danych i Usługi Sieciowe

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

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

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

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

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

Projektowanie systemów baz danych

DECLARE VARIABLE zmienna1 typ danych; BEGIN

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

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

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

Cele. Definiowanie wyzwalaczy

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

Bazy danych 10. SQL Widoki

Wykład 8. SQL praca z tabelami 5

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

PODSTAWY BAZ DANYCH 13. PL/SQL

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

Transakcje jednocześnie ACID

Język SQL, zajęcia nr 1

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

Bazy danych 7. SQL podstawy

Struktura drzewa w MySQL. Michał Tyszczenko

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

Bloki anonimowe w PL/SQL

Instalacja MySQL.

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

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

SQL :: Data Definition Language

Wykład 5. SQL praca z tabelami 2

BAZA DANYCH SIECI HOTELI

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

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

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

BAZY DANYCH Cz III. Transakcje, Triggery

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

15. Funkcje i procedury składowane PL/SQL

Bazy danych 9. SQL Klucze obce Transakcje

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

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

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

Aspekty aktywne baz danych

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

Hurtownia Świętego Mikołaja projekt bazy danych

Wykład 05 Bazy danych

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

1. Wyzwalacze BD (ang. triggers)

Cheatsheet PL/SQL Andrzej Klusiewicz 1/9

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

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. Zapytania SELECT. Dr inż. Paweł Kasprowski.

Zaawansowane bazy danych i hurtownie danych semestr I

Administracja i programowanie pod Microsoft SQL Server 2000

CREATE USER

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

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

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

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

1. Tworzenie tabeli. 2. Umieszczanie danych w tabeli

Relacyjne bazy danych. Podstawy SQL

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

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

Połączenie z bazą danych : mysql h u root -p Enter password: *******

Bazy danych 10. SQL Widoki, procedury składowane, kursory i wyzwalacze

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

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

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

Bazy danych 5. Samozłaczenie SQL podstawy

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

Bazy danych 10. Widoki, procedury składowane, kursory i wyzwalacze. P. F. Góra

Wyzwalacze. Anna Fiedorowicz Bazy danych 2

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

Oracle PL/SQL. Paweł Rajba.

Ćwiczenia 2 IBM DB2 Data Studio

Bazy danych 4. SQL podstawy. P. F. Góra

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

Wprowadzenie do projektowania i wykorzystania baz danych Relacje

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

SQL (ang. Structured Query Language)

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

Relacyjne bazy danych. Podstawy SQL

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

Kurs. Podstawy MySQL

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

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

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

Bazy danych. Polecenia SQL

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

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

Podstawy języka SQL. SQL Structured Query Languagestrukturalny

Bazy danych 9. Klucze obce Transakcje

Transkrypt:

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 mysql> CREATE TABLE konto (numer INT, ile DECIMAL(10,2)); mysql> CREATE TRIGGER konto_bi BEFORE INSERT ON konto FOR EACH ROW SET @sum = @sum + NEW.ile;

Aby sprawdzić jak to działa, można wstawić do tablicy konto odpowiednie wartości i sprawdzić, jaka jest wartość zmiennej @sum. A zatem mysql> SET @sum = 0; mysql> INSERT INTO konto VALUES(137,14.98),(141,1937.50),(97,-100.00); mysql> SELECT @sum AS 'Suma'; +---------+ Suma +---------+ 1852.48 +---------+ 1 row in set (0.00 sec) 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. mysql> DROP TRIGGER konto.konto_bi; Po co są triggery? Dzięki triggerom możemy: 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. słów DECLARE i SET, a zatem możemy deklarować i definiować zmienne, tak jak w procedurach i funkcjach. 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. Jak definiujemy trigger? mysql> CREATE TRIGGER <nazwa> { 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. Ponadto 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). Przywileje Aby móc definiować triggery, należy posiadać przywilej TRIGGER. mysql> GRANT TRIGGER ON <tablica> TO <użytkownicy>; natomiast odebranie tych przywilejów będzie moźliwe w taki mniej więcej sposób mysql> REVOKE TRIGGER ON <tablica> FROM <użytkownicy>;

Odnoszenie się do wartości OLD i NEW 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ść 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 użycia obydwu słów w poleceniu UPDATE mysql> CREATE TRIGGER tab_au BEFORE UPDATE ON tab; FOR EACH ROW BEGIN SET @old = OLD.s1; SET @new = NEW.s1; END;// Jeśli tablica tab zawiera jeden wiersz z wartością 10 w polu s1 i wykonamy 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: 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 //; mysql> CREATE TABLE tab (s1 INTEGER) // mysql> CREATE TRIGGER tab_bi BEFORE INSERT ON tab FOR EACH ROW BEGIN SET @a = 'trigger włączony'; SET NEW.s1 = 105; END;// mysql> DELIMITER ;//

Tak zdefiniowany trigger jest prymitywny, jednak dla celów poznawczych powinien wystarczyć. 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.

Zobaczmy co jest w tablicy i jakie wartości mają zmienne z triggera. mysql> SELECT @a, tab.* FROM tab; +------------------+------+ @a s1 +------------------+------+ trigger włączony 105 +------------------+------+ 1 row in set (0.00 sec) Jak widać, zamiast wstawionej wartości 1 w tablicy znalazła się wartość 105. Ponadto, wartość zmiennej @a zdefiniowanej 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.

Następny przykład 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. mysql> SELECT * from konto; +-------+---------+ numer ile +-------+---------+ 137 14.98 141 1937.50 97-100.00 +-------+---------+ 3 rows in set (0.00 sec)

mysql> DELIMITER //; mysql> CREATE TRIGGER konto_bu BEFORE UPDATE ON konto FOR EACH ROW BEGIN IF NEW.ile < 0 THEN SET NEW.ile = 0; ELSEIF NEW.ile > 100 THEN SET NEW.ile = 100; END IF; END;// mysql> DELIMITER ;//

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. Dla sprawdzenie, zmienimy wartości w polu ile we wszystkich rekordach wstawiając wartość mniejszą od zera, a następnie większą od 100. mysql> UPDATE konto SET ile=-20; Query OK, 3 rows affected (0.13 sec) Rows matched: 3 Changed: 3 Warnings: 0 mysql> SELECT * from konto; +-------+------+ numer ile +-------+------+ 137 0.00 141 0.00 97 0.00 +-------+------+ 3 rows in set (0.00 sec)

mysql> UPDATE konto SET ile=105; Query OK, 3 rows affected (0.00 sec) Rows matched: 3 Changed: 3 Warnings: 0 mysql> SELECT * from konto; +-------+--------+ numer ile +-------+--------+ 137 100.00 141 100.00 97 100.00 +-------+--------+ 3 rows in set (0.00 sec) Jak widzimy, trigger bardzo ładnie nam zadziałał sprawdzając wprowadzane nowe wartości i reagując odpowiednio.

Następny przykład 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. mysql> CREATE TABLE test1 (a1 INT); mysql> CREATE TABLE test2 (a2 INT); mysql> CREATE TABLE test3 (a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY); mysql> CREATE TABLE test4 ( a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b4 INT DEFAULT 0 );

mysql> DELIMITER mysql> CREATE TRIGGER test1_bi BEFORE INSERT ON test1 FOR EACH ROW BEGIN INSERT INTO test2 (a2) VALUES (NEW.a1); DELETE FROM test3 WHERE a3 = NEW.a1; UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; END; DELIMITER ; mysql> INSERT INTO test3 (a3) VALUES (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL); mysql> INSERT INTO test4 (a4) VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0), (0);

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); Query OK, 8 rows affected (0.01 sec) Records: 8 Duplicates: 0 Warnings: 0 Jako rezultat wykonania takiego polecenia w tablicach test1, test2, test3, test4 znajdą się następujące dane:

mysql> SELECT * FROM test1; +------+ a1 +------+ 1 3 1 7 1 8 4 4 +------+ 8 rows in set (0.00 sec)

mysql> SELECT * FROM test2; +------+ a2 +------+ 1 3 1 7 1 8 4 4 +------+ 8 rows in set (0.00 sec)

mysql> SELECT * FROM test3; +----+ a3 +----+ 2 5 6 9 10 +----+ 5 rows in set (0.00 sec)

mysql> SELECT * FROM test4; +----+------+ a4 b4 +----+------+ 1 3 2 0 3 1 4 2 5 0 6 0 7 1 8 1 9 0 10 0 +----+------+ 10 rows in set (0.00 sec)