/Wyzwalacze

Z Brain-wiki

TI:WTBD/Wyzwalacze

Wyzwalacze (triggery) są to operacje na danych wywoływane automatycznie w reakcji na inne operacje modyfikujące dane. Mogą one służyć np. logowaniu czasu i użytkownika zmieniającego dane, czy innym sytuacjom, gdy chcemy by określone dane były uaktualniane automatycznie w reakcji na modyfikacje innych danych.

Wyzwalacz może być powiązany z operacjami INSERT, DELETE lub UPDATE na określonej tabeli, lub z UPDATE na określonych kolumnach danej tabeli. Polegać może na wykonaniu innego polecenia INSERT, UPDATE lub DELETE, przed poleceniem wyzwalającym, po nim, lub zamiast niego.

Wyzwalacze tworzy się poleceniem

 CREATE TRIGGER nazwa
   { BEFORE | AFTER | INSTEAD OF } { DELETE | INSERT | UPDATE [ OF kol1, ... ] }
 ON tabela [ FOR EACH ROW ]
   [ WHEN warunek ]
 BEGIN polecenie1; [ polecenie2; ... ] END;
  • zamiast FOR EACH ROW może być FOR EACH STATEMENT, ale nie w SQLite, który jak dotąd nie wspiera tej wersji wyzwalaczy. FOR EACH ROW można więc pominąć (ale nie -- w innych systemach BD)
  • w klauzuli WHEN i w poleceniach wyzwalacza można się odwoływać do wartości pól zmienianego (odp. wstawianego lub usuwanego) wiersza; odwołania te są postaci OLD.kolumna i NEW.kolumna -- jeśli wiersz jest usuwany (wyzwalacz reaguje na DELETE), to nie są legalne odwołania NEW, itd.
  • przynajmniej w SQLite wyzwalacz nie może wykonywać działań na tabelach z innych baz niż ta, do której sam należy
  • wyzwalacz INSTEAD OF umożliwia stosowanie operacji zmieniających dane do widoków -- jeśli istnieje, to operacja go wywołująca na widoku staje się legalna i sprowadza się do wywołania triggera. Triggery INSTEAD OF są jednak legalne również i dla tabel
  • jeżeli trigger BEFORE UPDATE czy BEFORE DELETE sam modyfikuje wiersz, który ma być zmieniony lub usunięty, to wynik tej operacji jest nieokreślony, i to samo dotyczy tego, czy trigger AFTER związany z tą operacją zostanie wywołany
  • jeżeli istnieje wiele wyzwalaczy tego samego typu (np. AFTER) wyzwalanych przez tę samą operację, to kolejność ich wywołania należy uważać za nieokreśloną. Niektóre systemy BD (najnowsze Oracle) pozwalają na określenie tej kolejności, ale większość nie
  • istnieje też polecenie likwidujące wyzwalacz:
 DROP TRIGGER [ IF EXISTS ] [bazadanych.]nazwa;
  • przy likwidowaniu tabeli (DROP TABLE) związane z nią wyzwalacze giną automatycznie.