ullman201 (2)

ullman201 (2)



408 6. WIĘZY I WYZWALACZE W JĘZYKU SQL 1

1)    CREATE TRIGGER CenaSieciWyzw

2)    AFTER U?DATĘ OF cenaSieci ON FilmDyr

3)    REFERENCING

4)    OLD AS StaraKrotka,

5)    NEW AS NowaKrotka

6)    WHEN(StaraKrotka.cenaSieci > NowaKrotka.cenaSieci)

7)    UPDATE FilmDyr

8)    SET cenaSieci = StaraKrotka.cenaSieci

9)    WHERE cert# = NowaKrotka.cert#

10) FOR EACH ROW;

RYSUNEK 6.7 Wyzwalacz SQL3

W wierszu 6) zapisano warunek wyzwalania. Oznacza on, że działania mają być przetworzone przy próbie wprowadzenia niższej ceny sieci, tzn. gdy cena sieci prezesa spada.

Wiersze od 7) do 9) tworzą element działania; są to zwykłe instrukcje modyfikacji w SQL, a mają na celu odtworzenie ceny sieci sprzed modyfikacji. Trzeba zauważyć, że w zasadzie jest przeglądana każda krotka relacji FilmDyr, ale klauzula WHERE zapewnia, że akcja obejmie tylko modyfikowane krotki (te z właściwą wartością atrybutu cer.#).

W końcu, w wierszu 10) precyzuje się wymaganie użycia wyzwalacza dla każdej modyfikowanej krotki. Jeśliby go nie było, to wyzwalacz byłby zastosowany tylko raz podczas przetwarzania instrukcji SQL, bez względu na to, jak wiele razy zaszłoby zdarzenie wchodzące w skład wyzwalacza.

Oczywiście w przykładzie 6.16 zilustrowano tylko niektóre właściwości wyzwalaczy z SQL3. Poniżej opisujemy inne możliwości wyzwalaczy oraz sposoby ich stosowania.

♦    Z tekstu w wierszu 2) na rys. 6.7 wynika, że akcje są przetwarzane po zajściu zdarzenia wyzwalania, na co wskazuje specyfikacja AFTER. Alternatywę dla AFTER stanowią;

1.    3EFORE. Warunek when sprawdza się przed zajściem zdarzenia. Akcje wyzwalacza zostają przetworzone, o ile warunek jest spełniony. Wówczas zdarzenie, które powoduje modyfikację, zachodzi, bez względu na to, czy warunek jest spełniony, czy nie.

2.    INSTSAD CF. Akcja jest wykonywana (przy spełnieniu warunku WHEN), ale zdarzenie nigdy nie następuje.

•    Poza UPDATĘ innymi zdarzeniami wyzwalanymi mogą być insert oraz DELETE. Klauzula OF cenaSieci w wierszu 2) na rys. 6.7 może (ale nie musi) wystąpić dla zdarzenia UPDATE, a jeśli występuje, to określa po wyrazie OF te atrybuty, których ma dotyczyć modyfikacja. Klauzula OF nie jest dopuszczalna dla zdarzeń DELETF. oraz INSERT, ponieważ te operacje mają sens wyłącznie dla całych krotek.

•    Jeśli akcje są opisane pojedynczymi instrukcjami SQL, to wówczas oddziela się je średnikami.

•    Jeśli zdarzenie polega na modyfikacji, to są z nim związane dwie krotki, stara i nowa, odpowiednio sprzed modyfikacji i po modyfikacji. Krotkom tym nadaje się nazwy w klauzulach OLD as i NEW AS, a przykład stosowania umieszczono w wierszach 4) i 5). Jeśli zdarzenie polega na dopisaniu krotki, to można użyć klauzuli NEW as do nazwania wstawianej krotki, klauzula OLD AS nie jest dopuszczalna w takiej sytuacji. Odwrotnie postępujemy w przypadku usuwania krotek, wówczas korzystamy z klauzuli OLD AS do nazwania usuwanej krotki, natomiast klauzuli NEW AS nie stosuje się.

•    Jeśli opuścimy opcję FOR EACH ROK w wierszu 10), to wyzwalacz poziomu-wierszy (row-level trigger) stanie się wyzwałaczem poziomu--instrukcji {$tatement-level trigger). Wyzwalacz poziomu-instrukcji wykonuje się jeden raz przy instrukcji powodującej jedno lub więcej zdarzeń wyzwalacza. Na przykład, jeśli instrukcja SQL polega na modyfikacji całej tabeli, to wyzwalacz poziomu-instrukcji wykona się tylko jeden raz, a wyzwalacz poziomu-wierszy wykona się przy modyfikacji każdej krotki. W przypadku wyzwalaczy poziomu-instrukcji nie można bezpośrednio korzystać ze starych i nowych krotek (wiersze 4) i 5)). Można wówozas mów ić raczej o zbiorze starych krotek (krotkach usuniętych lub starych wersjach krotek zmodyfikowanych) i o zbiorze nowych krotek (krotek wstawianych lub nowych wersji krotek modyfikowanych) jako o dwóch relacjach. Stosujemy zatem, zamiast deklaracji z wierszy' 4) i 5) z rys. 6.7, deklaracje old_TA?.le AS TeStare oraz NEW_?ABLE AS TeNowe. Wyraz TeStare oznacza nazwę relacji zawierającej wszystkie stare krotki, a TeNowe oznacza relację zawierającą nowe krotki.

PRZYKŁAD 6.17

Załóżmy, żc należy ochronić wartość sieci prezesów od spadku poniżej 500 000 S. Takie ograniczenie może zostać naruszone przez każdą operację: wstawianie, usuwanie oraz modyfikację w kolumnie cenaSieci relacji:

FilmDyr(nazwisko, adres, cert#, cenaSieci)

Trzeba więc utworzyć wyzwalacze dla każdego z tych trzech zdarzeń. Na rysunku 6.8 pokazano przypadek modyfikacji. Wyzwalacze dla wstawiania i usuwania są podobne, ale nieco prostsze.

W wierszach od 3) do 5) określono, że TeNowe i TeStare są nazwami relacji zawierających odpowiednio stare i nowe krotki uzyskane w wyniku operacji wyzwalania na bazie danych. Trzeba zauważyć, że jedna instrukcja $QL może spowodować modyfikację szeregu krotek relacji i wówczas TeNo-we i TeStare będą zawierać wiele krotek.


Wyszukiwarka

Podobne podstrony:
ullman202 (2) 410 6. WIĘZY IWYZWALACZE W JĘZYKU SQL 1)    CREATE TRIGGER WyzwąlaczśrC
ullman195 (2) 396 6. WIĘZY l WYZWALACZE W JEŻYKU SQl. nyrni”. Podczas gdy pozostałe typy więzów są t
ullman204 (2) 414 6. WIĘZY 1 WYZWALACZE W JĘZYKU SQL ♦    Więzy kratkowe typu CIIEC.K
53198 ullman186 (2) a__________Więzy i wyzwalacze w języku SQL W bieżącym rozdziale opiszemy te aspe
11038 ullman189 (2) 384 6. WIĘZY IWYZWALACZE W JĘZYKU SQL 1 Odpowiedniość między atrybutami pre
ullman197 (2) 4UU 6 WIĘZY I WYZWALACZE W JĘZYKU SOL  GwiazdyW(tytułFilmu, rokFilmu,
65226 ullman199 (2) 404 6. WIĘZY r wyzwalacze w języku soi. 404 6. WIĘZY r wyzwalacze w języku soi.
55786 ullman196 (2) 398 6. WIĘZY l WYZWALACZE W JĘZYKU SOL Mimo że ascrcja obejmuje dwie relacje, to

więcej podobnych podstron