Wyzwalacz (ang. trigger) to specjalny rodzaj procedury, którą baza danych odpala sama, w reakcji na konkretne zdarzenie w tabeli — najczęściej INSERT, UPDATE albo DELETE. Nikt go ręcznie nie wywołuje. Definiujesz go raz, a potem żyje w bazie i czeka jak czujka na ruch: zmieniłeś dane w tabeli? Wyzwalacz wykonuje swój kod automatycznie, zanim albo zaraz po tym, jak operacja się zadzieje.
Logika dzieli się na dwa wymiary. Po czasie wykonania: BEFORE (przed zapisem — dobre do walidacji i poprawiania danych) oraz AFTER (po zapisie — dobre do logowania i kaskadowych zmian). Po zakresie: FOR EACH ROW (odpala się dla każdego zmienianego wiersza) albo na poziomie całej instrukcji. W środku wyzwalacza masz dostęp do wartości starych i nowych — w PostgreSQL przez OLD i NEW, podobnie w Oracle, a w SQL Server przez tabele pseudo inserted i deleted.
Do czego to służy w praktyce? Najczęściej do pilnowania spójności i automatyzacji bez ufania, że każda aplikacja zrobi to za Ciebie. Audyt zmian, przeliczanie sum, blokowanie nieprawidłowych wartości, znaczniki czasu — to wszystko klasyczne zadania dla triggera.
Przykład z praktyki
Klasyk: automatyczna data ostatniej modyfikacji w PostgreSQL. Tworzysz funkcję, a potem wyzwalacz, który ją wywołuje:
CREATE TRIGGER set_updated BEFORE UPDATE ON users FOR EACH ROW EXECUTE FUNCTION touch_updated_at();
Funkcja w środku robi NEW.updated_at = now(); RETURN NEW; — i od teraz każdy UPDATE na tabeli users sam ustawia świeży timestamp. Aplikacja nie musi o tym pamiętać, bo baza pilnuje tego za nią.
Na co uważać
Wyzwalacze mają reputację „magii, która gryzie”. Bo działają w tle — gdy dane zmieniają się inaczej, niż się spodziewasz, a w kodzie aplikacji nic nie ma, pierwsze pytanie brzmi: czy nie siedzi tu jakiś trigger? Najczęstsze grzechy:
- Ukryta logika — biznesowe reguły schowane w triggerze są trudne do debugowania i łatwo o nich zapomnieć.
- Wydajność —
FOR EACH ROWprzy masowymUPDATEmilionów wierszy potrafi zabić operację. - Kaskady i pętle — trigger, który modyfikuje inną tabelę, która ma swój trigger, który wraca do pierwszej… witaj w rekurencji.
Zasada zdrowego rozsądku: używaj ich do spójności danych i audytu, a nie do całej logiki biznesowej.
Pojęcia powiązane: procedura składowana (stored procedure), constraint, transakcja, klucz obcy (foreign key), event-driven, ORM.