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 wUPDATE
iDELETE
).
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.