406 6. WlljZY I WYZWALACZE W JEŻYKU SOL
ograniczany. Na przykład warunki więzów CHECK są sprawdzane zawsze, gdy zmiana dotyczy krotki zawierającej wartość ograniczanego atry butu (nawet gdy operacja polega na dołączaniu nowej krotki).
Ponieważ implementacja więzów polega na „wyzwoleniu” sprawdzenia warunków na skutek zajścia określonych zdarzeń, więc nasuwa się pytanie, czy to nie programista, zamiast systemu, powinien określać zdarzenie wyzwalane przy sprawdzeniu warunku. Przy takim podejściu użytkownik miałby szersze możliwości wyboru operacji wykonywanych w bazie danych i mógłby je określać nic tylko w celu ochrony przed naruszeniem ograniczeń. Dlatego w standardzie SQL3 umieszczono również „wyzwalacze”, które są pochodną więzów, ale umożliwiają określenie zarówno konkretnych zdarzeń kontekstowych dla warunku więzów, jak i operacji, które mają być przetworzone w określonych sytuacjach. Może wydać się interesujące, że systemy oferowane obecnie na rynku są, w zakresie elementów aktywnych, bliższe standardowi SQL3 niż $QL2. Prawdopodobnie dzieje się tak dlatego, że komercyjnym producentom jest w pewnym sensie łatwiej implementować wyzwalacze niż asercje.
Wyzwalacze, czasami nazywane regułami zdarzeńie-warunek-akcja (ECA rules, czyli event-condition-action\ różnią się od omawianych poprzednio więzów na trzy sposoby:
1. Wyzwalacze są testowane tylko przy zajściu określonego przez programistę zdarzenia. Typy takich zdarzeń obejmują zazwyczaj dołączanie, modyfikacje lub usuwanie krotek danej relacji. W niektórych implementacjach SQL występuje również inny rodzaj zdarzeń; zakończenie transakcji (w podrozdziale 7.2 omówiono atomowe jednostki przetwarzania, nazywane transakcjami, używane jako niepodzielne operacje w bazie danych).
2. Wyzwalacze testują warunek w chwili zajścia zdarzenia, a nie uprzedzając je. Jeśli warunek nie jest spełniony, to w odpowiedzi na zdarzenie nic się nie wykona.
3. Jeśli warunek wyzwalacza zostanie spełniony, to DBMS przetwarza akcją związaną z wyzwałaczem. Akcja może chronić przed zajściem zdarzenia w bazie lub może zmienić wynik zdarzenia (np. usunąć wprowadzoną krotkę). Akcja może polegać na przetworzeniu całego ciągu operacji w bazie danych, nawet takich, które nie mają żadnego związku z wyzwalanym zdarzeniem.
W dalszym ciągu najpierw omówimy wyzwalacze z SQL3. Potem krótko opiszemy rozszerzenia w SQL3 więzów z SQL2, nazywanych asercjami. Właśnie tego typu więzy mają pewne cechy wyzwalaczy.
Instrukcja wyzwalacza w SQL3 udostępnia użytkownikowi wiele op< w zakresie każdego elementu: zdarzenia, warunku i akcji. Podstawowe wl ściwości są następujące:
1. Akcja może być wykonana przed, po i w chwili zajścia zdarzenia.
2. Akcja może korzystać zarówno z wartości sprzed zajścia zdarzeń jak i z nowych wartości powstałych w wyniku wstawienia, mody fik cji lub usunięcia krotki w trakcie zdarzenia.
3. Zdarzenia mogą wprowadzać modyfikacje do określonej kolumny 1 do zbioru kolumn.
4. Warunek można określać w klauzuli when i akcja jest wykonywa przy' wyzwoleniu reguły oraz warunek jest spełniony, gdy zajdzie w zwalane zdarzenie.
5. Programista może sam określić, czy akcja ma być wykonana:
a) zawsze dla każdej modyfikowanej krotki,
b) raz dla wszystkich modyfikowanych krotek w pojedynczej opera w bazie danych.
Zanim przedstawimy szczegółowy opis syntaktyki wyzwalaczy, rozv żymy przykład ilustrujący najważniejsze właściwości wyzwalaczy żarów składniowe, jak i semantyczne. W tym przykładzie wyzwalacz wykonuje osobno dla każdej modyfikowanej krotki.
PRZYKŁAD 6.16
Napiszemy wyzwalacz w SQL3, który będzie stosowany dla relacji:
FilmDyr(nazwisko, adres, cert#, cenaSieci)
Akcja jest wyzwalana przy próbie modyfikacji atrybutu cenaSieci. W v niku powinna zostać uniemożliwiona każda próba obniżenia ceny sieci pre sa studia. Deklarację wyzwalacza pokazano na rys. 6.7.
W wierszu 1) zapisano deklarację złożoną ze słowa kluczowego CRF.7 TRIGGER oraz nazwy wyzwalacza. W drugim wierszu określa się wyzwrak zdarzenie, którym jest modyfikacja wartości atrybutu cenaSieci w rek FilmDyr. W wierszach od 3) do 5) zapisano elementy warunków' i akcji \ zwalacza, które obejmują zarówno stare wartości krotki (krotka przed mo fikacją), jak i nową krotkę ze zmodyfikowanymi wartościami. Tc krotki identyfikowane poprzez nazwy StaraKror.ka i NowaKrorka, odpowied do deklaracji w wierszach 4) i 5). Można tych nazw używać w warunk i akcjach tak samo jak nazw zmiennych dla krotek, występujących w z\ czajnej klauzuli EROM języka SQL.