Lekcja 28: Wprowadzenie do Wyzwalaczy (Triggers)

Preview Mode

You're viewing this material in preview mode. Sign up to track your progress and access all features.

Lekcja 28: Wprowadzenie do Wyzwalaczy (Triggers)
Required In Progress

Czym jest wyzwalacz (trigger)?

Wyzwalacz (trigger) to specjalny, zaawansowany typ procedury składowanej (kodu), który jest automatycznie wykonywany przez silnik bazy danych w odpowiedzi na określone zdarzenie DML. Jest to "mechanizm pułapkowy" lub "aktywna reguła" w bazie danych. Mówimy bazie: "Jeśli ktoś spróbuje zrobić X na tabeli Y, automatycznie zrób Z".

Koncepcja

Automatyczna akcja (procedura) wykonywana w odpowiedzi na zdarzenie (INSERT, UPDATE, DELETE).

Nasłuchiwanie zdarzeń DML

Definiujemy wyzwalacz, który nasłuchuje konkretnej tabeli na jedno z trzech zdarzeń DML:

  • INSERT (próba wstawienia nowego wiersza)
  • UPDATE (próba modyfikacji wiersza)
  • DELETE (próba usunięcia wiersza)

Kiedy się wykonują? (BEFORE lub AFTER)

Logika wykonania zależy od dialektu SQL, ale generalnie dzielimy je na:

  • AFTER (np. AFTER INSERT): Trigger uruchamia się po pomyślnym wykonaniu operacji (np. dane są już w tabeli). Idealny do logowania, audytu lub aktualizacji danych w innych, powiązanych tabelach.
  • BEFORE (np. BEFORE INSERT): Trigger uruchamia się przed wykonaniem operacji. Idealny do walidacji danych (bardziej skomplikowanej niż CHECK) lub do modyfikacji danych przed ich zapisaniem (np. "zawsze ustawiaj Nazwisko na wielkie litery").

Proste przykłady użycia

Przykładowe zastosowania: logowanie zmian, automatyczne ustawianie daty modyfikacji.

Audyt (Logowanie)

Możemy stworzyć trigger AFTER DELETE ON Uczniowie. Za każdym razem, gdy ktoś usunie ucznia, trigger automatycznie pobierze dane usuniętego wiersza (dostępne w specjalnej, tymczasowej tabeli deleted w T-SQL lub OLD w PostgreSQL) i wstawi je do tabeli ArchiwumUczniow wraz z datą usunięcia i informacją, który użytkownik to zrobił.

-- przykładowy pseudokod
AFTER DELETE ON Uczniowie
  INSERT INTO ArchiwumUczniow (kol1, kol2, DataUsuniecia, KtoUsunal)
  VALUES (OLD.kol1, OLD.kol2, NOW(), CURRENT_USER);

Automatyzacja (Ustawianie daty modyfikacji)

Możemy stworzyć trigger AFTER UPDATE ON Produkty. Za każdym razem, gdy dowolny wiersz w tabeli Produkty jest modyfikowany, trigger automatycznie zaktualizuje kolumnę DataOstatniejModyfikacji w tym wierszu na bieżącą datę (np. NOW() lub GETDATE()).

-- przykładowy pseudokod
AFTER UPDATE ON Produkty
  UPDATE Produkty
  SET DataOstatniejModyfikacji = NOW()
  WHERE id = NEW.id;

Uwaga: Składnia jest mocno zależna od konkretnego silnika bazy danych.

W przeciwieństwie do SELECT czy INSERT, które są mocno standaryzowane, składnia CREATE TRIGGER oraz język, w którym pisze się logikę triggera (np. T-SQL w SQL Server, PL/pgSQL w PostgreSQL, PL/SQL w Oracle), są bardzo specyficzne dla danego systemu RDBMS. Ta lekcja skupia się na idei i koncepcji wyzwalaczy, a nie na ich konkretnej implementacji.