Trigger (wyzwalacz)- umożliwia nam wykonanie jakiejś czynności gdy na tabeli zachodzą jakieś zmiany.
Przykład:
Wyobraźmy sobie że mamy system bankowy. Naturalną rzeczą jest tutaj logowanie wszystkiego co się da…
Użytkownik A(id = 2) chce przelać 1024zł na konto użytkownika 1337 :)
Bez użycia triggerów:
- Zmniejszamy stan konta o 1024zł
UPDATE `uzytkownik` SET `malopieniedzy` = `malopieniedzy` - 1024 WHERE `uzytkownik`.`id` =1;
- Ustawiamy nowy przelew
INSERT INTO `przelew` (`od`, `do`, `ile`, `kiedy`) VALUES ('1', '1337', '1024', '2010-08-30 20:47:39'); - Zapisujemy do loga
INSERT INTO `log` (`kto`, `ile`, `kiedy`) VALUES ('1', '1024', '2010-08-30 20:47:39');
Wykonujemy 3 zapytania i aż 3 razy przesyłamy te same dane!
Z użyciem triggerów
- Piszemy trigger-y (jednorazowo)
CREATE TRIGGER `zabieram_pieniadze` BEFORE INSERT ON `przelew` FOR EACH ROW UPDATE `uzytkownik` SET `malopieniedzy` = `malopieniedzy` - NEW.ile WHERE `id` = NEW.od;CREATE TRIGGER `zapis_do_loga` AFTER INSERT ON `przelew` FOR EACH ROW INSERT INTO `log` (`kto`, `ile`, `kiedy`) VALUES (NEW.od, NEW.ile, NEW.kiedy); - Ustawiamy nowy przelew
INSERT INTO `przelew` (`od`, `do`, `ile`, `kiedy`) VALUES ('1', '1337', '1024', '2010-08-30 20:47:39');
Jak to będzie wyglądało ?
MySQL widzi że chcemy wstawić do bazy dane (INSERT `przelew`), jako że istnieje trigger `zabieram_pieniadze`, to zostanie wykonany nim wstawimy dane do przelewu (takie magiczne słówko “BEFORE”).
Mamy też trigger `zapis_do_loga` który zostanie uruchomiony po wykonaniu operacji INSERT (magiczne słówko “AFTER”)
Fajne, fajne ale gdzie będziemy tego używać?
W tym projekcie triggery zostaną użyte dla tabel typu MyISAM aby automatycznie wstawiać dane.
* Triggery działają tylko dla INSERT, UPDATE i DELETE
** Zapytania pisane z palca – mogą być drobne błędy w składni









