Wyzwalacze
Do każdej tabeli można określić 12 (wiersz/instrukcja x przed/po x insert/update/delete) typów wyzwalaczy. Może być więcej niż jeden wyzwalacz danego typu
(nie ma kontroli nad kolejnością odpalania wyzwalaczy tego samego typu).
CREATE [OR REPLACE] TRIGGER nazwa_wyzwalacza
{BEFORE|AFTER} specyfikacja instrukcji --INSERT OR DELETE OR UPDATE OF kolumna, ...
ON tabela [FOR EACH ROW]
blok PL/SQL
Kolejność odpalania wyzwalaczy różnych typów zgodna ze zdrowym rozsądkiem: przed instrukcją, przed wierszem, po wierszu, ..., po instrukcji
Typowe sytuacje użycia wyzwalaczy:
- Sprawdzanie więzów spójności: przykład1. W wyzwalaczach wierszowych jest dostęp do starych i nowych wartości, np.:
IF :NEW.sal < :OLD.sal
- Wykonywanie stałych czynności wymaganych po wykonaniu instrukcji: przykład2. Można sprawdzić jaka instrukcja odpaliła wyzwalacz. Służą do tego zmienne:
INSERTING
, DELETING
i UPDATING
.
- Do wykonywania obliczeń przed wstawieniem lub aktualizacją: przykład3. Albo druga wersja: przykład4.
- Wymuszanie więzów spójności niemożliwych do zrealizowania deklaratywnie: przykład5.
Ograniczenia:
Te ograniczenia są z dokumentacji do porzednich wersji Oracla. Teraz jest troche inaczej. Proszę wypróbować wyzwalacze z przykładów.
Ich nazwa wskazuje, czy według tych zasad powinnych działać czy nie.
- W wyzwalaczu nie można użyć
SAVEPOINT
, COMMIT
, ani ROLLBACK
.
- Jeżeli tabela ograniczająca to tabela, która przy pomocy klucza obcego odwołuje się (pośrednio lub bezpośrednio) do tabeli wyzwalacza to: w wyzwalaczu nie wolno zmieniać wartości w kolumnach klucza głównego, jednoznacznego i obcego tabeli ograniczającej: przykład6.
- Jeżeli table zmieniana to albo tabela wyzwalacza, albo tabela odwołująca się do tabeli wyzwalacza poprzez więzy spójności
ON DELETE CASCADE
to w wyzwalaczu wierszowym nie wolno odczytywać wartości tabeli zmienianej z wyjątkiem pojedyńczego wiersza za pomocą instrukcji INSERT INTO ... VALUES ...
przykład7.
(Można to trochę obejść, bo do tych wartości można sięgać w wyzwalaczu napisanym na poziomie instrukcji i przekazywać je dzięki zmiennym zadeklarowanym w pakiecie: przykład8.)
Wyzwalacze typu INSTEAD OF
Istnieje dodatkowy typ wyzwalacza dla perspektyw:
CREATE [OR REPLACE] TRIGGER nazwa_wyzwalacza
INSTEAD OF specyfikacja instrukcji
ON perspektywa
blok PL/SQL
Jest odpalany ZAMIAST podanej w definicji instrukcji.
przykład9