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

3 przemyślenia nt. „MySQL 5 – czego nie było wcześniej cd 2”

  1. Hej 🙂 super blog !

    wiesz moze jak zrobić triggera w MySQL na UPDATE tylko danej kolumny ? Mam cos takiego :

    CREATE TRIGGER tralalala
    AFTER UPDATE ON projekty FOR EACH ROW
    BEGIN
    IF NEW.tytul OLD.tytul
    INSERT INTO historia SET lista = „zapisano”;
    END;

    Niestety gdzies jest blad.

    Pozdrawiam 🙂

  2. miedzy NEW.tytul a OLD tytul jest zamkniety nawias (ostry) Twók blog przycina niedozwolone znaki 😉

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *