Wyzwalacze w MySQL

1. Czym są wyzwalacze (triggers) w MySQL?

Wyzwalacze (triggers) to specjalne obiekty bazy danych, które automatycznie wykonują określone operacje w reakcji na zdarzenia zachodzące w tabelach. Wyzwalacze działają na:

  • INSERT – uruchamiają się po dodaniu rekordu do tabeli,
  • UPDATE – uruchamiają się po zmianie wartości w tabeli,
  • DELETE – uruchamiają się po usunięciu rekordu z tabeli.

Wyzwalacze mogą być wywoływane PRZED (BEFORE) lub PO (AFTER) danej operacji.


2. Tworzenie Wyzwalaczy

2.1. Struktura wyzwalacza
CREATE TRIGGER nazwa_wyzwalacza
BEFORE | AFTER INSERT | UPDATE | DELETE
ON nazwa_tabeli
FOR EACH ROW
BEGIN
    -- instrukcje SQL, np. INSERT, UPDATE
END;
  • BEFORE – wyzwalacz uruchamia się przed wykonaniem operacji,
  • AFTER – wyzwalacz uruchamia się po wykonaniu operacji,
  • NEW.kolumna – odnosi się do nowo wstawianej wartości,
  • OLD.kolumna – odnosi się do wartości przed zmianą (tylko w UPDATE i DELETE).

3. Przykłady Wyzwalaczy

3.1. Wyzwalacz AFTER INSERT

Automatyczne dodawanie logu do tabeli historia_logowania po dodaniu nowego użytkownika.

DELIMITER //

CREATE TRIGGER dodaj_log_po_rejestracji
AFTER INSERT ON uzytkownicy
FOR EACH ROW
BEGIN
    INSERT INTO historia_logowania (uzytkownik_id, data_logowania, akcja)
    VALUES (NEW.id, NOW(), 'Rejestracja użytkownika');
END //

DELIMITER ;

📌 Działanie: Gdy nowy użytkownik zostanie dodany do tabeli uzytkownicy, automatycznie zapisujemy informację o rejestracji w historia_logowania.


3.2. Wyzwalacz BEFORE UPDATE

Blokowanie aktualizacji ceny produktu do wartości poniżej 0.

DELIMITER //

CREATE TRIGGER sprawdz_cene_produktu
BEFORE UPDATE ON produkty
FOR EACH ROW
BEGIN
    IF NEW.cena < 0 THEN
        SET NEW.cena = 0;
    END IF;
END //

DELIMITER ;

📌 Działanie: Przed aktualizacją ceny produktu sprawdzamy, czy nowa cena jest ujemna. Jeśli tak, ustawiamy ją na 0.


4. Ćwiczenia dla uczniów

Ćwiczenie 1: Wyzwalacz dla INSERT

📌 Cel: Stwórz wyzwalacz AFTER INSERT, który po dodaniu nowego zamówienia zapisze informację do tabeli log_zamowienia.

Ćwiczenie 2: Wyzwalacz dla UPDATE

📌 Cel: Stwórz wyzwalacz BEFORE UPDATE, który przed zmianą statusu zamówienia sprawdzi, czy nowy status to "Anulowane", a jeśli tak, doda wpis do tabeli historia_zamowien.


5. Tworzenie tabeli do ćwiczeń

Przed wykonaniem ćwiczeń utwórz odpowiednie tabele:

CREATE TABLE zamowienia (
    id INT AUTO_INCREMENT PRIMARY KEY,
    klient_id INT,
    kwota DECIMAL(10,2),
    status VARCHAR(20)
);

CREATE TABLE log_zamowienia (
    id INT AUTO_INCREMENT PRIMARY KEY,
    zamowienie_id INT,
    data_logu DATETIME,
    akcja VARCHAR(50)
);

CREATE TABLE historia_zamowien (
    id INT AUTO_INCREMENT PRIMARY KEY,
    zamowienie_id INT,
    data_zmiany DATETIME,
    poprzedni_status VARCHAR(20)
);

6. Wstawienie testowych danych

INSERT INTO zamowienia (klient_id, kwota, status) VALUES
(1, 120.50, 'Nowe'),
(2, 200.00, 'Oczekuje'),
(3, 450.75, 'Zrealizowane'),
(4, 99.99, 'Nowe'),
(5, 320.00, 'Wysłane');

📌 Po tej lekcji uczniowie powinni umieć:
✅ Tworzyć wyzwalacze dla operacji INSERT i UPDATE,
✅ Obsługiwać zmienne NEW i OLD,
✅ Zapisywać zmiany w dodatkowych tabelach logowania.