MySQL 5 – czego nie było wcześniej cd 2

Triggery zwane inaczej wyzwalaczami, ponieważ ich wywołanie zwykle uzależnione jest od jakiegoś zdarzenia. Zdarzeniem tym zwykle jest jakaś operacja na danych – INSERT, DELETE bądź UPDATE. Wyzwalacz może być wywoływany albo przed (BEFORE) albo po (AFTER) zdarzeniu (włożeniu do bazy rekordu, usunięciu go lub zmienieniu)

Przykładowo utworzony trigger:

CREATE TRIGGER nazwa_triggera
BEFORE UPDATE ON nazwa_tabeli
FOR EACH ROW SET NEW.nazwa_pola="jakis tekst";

Trigger ten jest może średnio przydatny ale dobrze ilustruje możliwości. Co powoduje – otóż przed każdym insertem do tabeli “nazwa_tabeli” w pole nazwa_pola wpisywany jest “jakis_tekst”. Nawet jeśli polecenie INSERT będzie wyglądać mniej więcej tak:

CREATE TRIGGER nazwa_trigger
AFTER DELETE ON nazwa_tabeli
FOR EACH ROW SET @oidy=CONCAT(@oidy,','OLD.id);

To trigger spowoduje, że zamiast tekstu “tralalalala” zostanie w bazie umieszcziony tekst “jakis tekst”. Przyda się to jeśli już po stronie serwera baz danych chcemy w jakiś sposób weryfikować dane zapisywane do bazy. Oczywiście zamiast możemy też zrobić trigger reagujący na UPDATE danych:

CREATE TRIGGER nazwa_triggera
BEFORE UPDATE ON nazwa_tabeli
FOR EACH ROW SET NEW.nazwa_pola="jakis tekst";

Wówczas jeśli wywołamy następujący UPDATE:

UPDATE nazwa_tabeli SET id=id+12 WHERE id>12;

Wszystkie wiersze przetworzone przez to zapytanie, czyli te gdzie w polu id jest liczba większa od 12 w polu nazwa_pola będą miały tekst postaci “jakis tekst”.

Można by też zrobić trigger, który zwróci nam id wszystkich usuniętych z bazy elementów:

CREATE TRIGGER nazwa_triggera
AFTER DELETE ON nazwa_tabeli
FOR EACH ROW SET @oidy=CONCAT(@oidy,','OLD.id);

Następnie usuwamy to co potrzebujemy uprzednio ustawiając zmienną @oidy na pustą:

SET @oidy='';
DELETE FROM nazwa_tabeli WHERE id>100;

Żeby dowiedzieć się jakie id zostały usunięte:

SELECT @oidy

Wówczas otrzymamy ciąg w postaci np.:125,240,2134