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 wUPDATEiDELETE).
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.