Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

WYZWALACZE (TRIGGERY) Wyzwalacz jest specjalnym rodzajem procedury składowanej, która może być wykonana w odpowiedzi na jedną z trzech sytuacji: UPDATE.

Podobne prezentacje


Prezentacja na temat: "WYZWALACZE (TRIGGERY) Wyzwalacz jest specjalnym rodzajem procedury składowanej, która może być wykonana w odpowiedzi na jedną z trzech sytuacji: UPDATE."— Zapis prezentacji:

1 WYZWALACZE (TRIGGERY) Wyzwalacz jest specjalnym rodzajem procedury składowanej, która może być wykonana w odpowiedzi na jedną z trzech sytuacji: UPDATE INSERT DELETE Wyzwalacze są najbardziej użyteczne przy wymuszaniu więzów integralności.

2 SKŁADNIA CREATE TRIGGER nazwa_triggera [BEFORE | AFTER [DELETE | INSERT | UPDATE | UPDATE OF lista_kolumn] [ ORDER integer ] ON nazwa_tablicy [ REFERENCING [ OLD AS STARA_nazwa ] [ NEW AS nowa_nazwa ]] [ FOR EACH { ROW | STATEMENT } ] [ WHEN (warunek) ] [ IF UPDATE ( nazwa_kolumny ) THEN [ { AND | OR } UPDATE (nazwa_kolumny ) ]... ] … złożone wyrażenie END IF ] ] BEGIN …… END

3 PRZYKŁAD : CREATE TRIGGER wprowadz before insert order 3on dba.PRACOWNICY REFERENCING NEW AS nowy_pracownik FOR EACH ROW BEGIN IF nowy_pracownik.identyfikator = any (select identyfikator from pracownicy) THEN message Nr pracownika musi być unikalny' type action to client; rollback trigger END IF; IF NOT nowy_pracownik.kod_dzialu =any (select kod_dzialu from kody_i_nazwy_dzialow) THEN message Taki dział nie istnieje' type action to client; rollback trigger END IF; IF year(now(*) – year(nowy_pracownik.data) < 18 THEN message Nie przyjmujemy niepełnoletnich type action to client; rollback trigger END IF; END

4 INNY PRZYKŁAD CREATE TRIGGER identyfikator AFTER INSERT on Pracownicy REFERENCING NEW AS new_id FOR EACH ROW BEGIN DECLARE err char (40); SET err='Nie wolno użyć takiego identyfikatora'; IF new_id.id_pr = 0000 then MESSAGE err TYPE ACTION TO CLIENT; ROLLBACK TRIGGER END IF END

5 PRZYKŁAD: W bazie istnieje tablica STAN(id, liczba zatrudnionych), w której pamiętana jest ilość załogi w każdym dziale. Informacja ta jest automatycznie aktualizowana po wstawieniu nowego pracownika do tablicy PRACOWNICY lub przy przeniesieniu pracownika do innego działu (update kod działu). Stan załogi w dziale nie może przekroczyć 100 osób. ALTER trigger zatrudnienie after insert, update of kod działu, delete on pracownicy referencing new as wstawiane old as usuwane for each row begin if inserting then begin if (select "liczba zatrudnionych" from stan where stan.id=wstawiane."kod działu")<101 then begin update stan set stan."liczba zatrudnionych"=stan."liczba zatrudnionych"+1 where wstawiane."kod działu"=stan.id end else begin message 'Blad' type action to client; rollback trigger; end end if end elseif deleting then begin update stan set stan."liczba zatrudnionych"=stan."liczba zatrudnionych"-1 where usuwane."kod działu"=stan.id end elseif updating then begin update stan set stan."liczba zatrudnionych"=stan."liczba zatrudnionych"+1 where wstawiane."kod działu"=stan.id; update stan set stan."liczba zatrudnionych"=stan."liczba zatrudnionych"-1 where usuwane."kod działu"=stan.id end end if; end

6 WYZWALACZE I TRANSAKCJE Operacje wykonywane w wyzwalaczu są przeprowadzane niejawnie jako część transakcji: 1.Uruchomione zostaje niejawnie polecenie BEGIN TRANSACTION (dla tabeli posiadającej wyzwalacze). 2.Następuje operacja INSERT, UPDATE lub DELETE. 3.Wywoływany jest wyzwalacz i wykonywane są jego polecenia. 4.Wyzwalacz albo cofa transakcję, albo transakcja jest niejawnie zatwierdzana.

7 Ograniczenia w stosowaniu wyzwalaczy: –Wyzwalacze nie mogą być tworzone dla tabel tymczasowych. –Wyzwalacze muszą być tworzone dla tabel w bieżącej bazie danych. –Wyzwalacze nie mogą być tworzone dla widoków. –Przy usuwaniu tabeli automatycznie usuwane są też wszystkie związane wyzwalacze.

8 Przykład bazy projektowanej na ćwiczeniach

9 W tej bazie jest wiele triggerów. Z każdą tablicą może być związany trigger działający na INSERT, sprawdzający poprawność wstawianych danych, Dodatkowo np. przy wstawianiu do tablicy Faktura nowej faktury, uzupełniana jest data wystawienia faktury (data bieżąca). Jeśli przy wstawianiu nie jest określona przez użytkownika data płatności, to również przyjęta jest ta data jako bieżąca. Użytkownik może wpisać samodzielnie datę płatności, ale musi to być maksymalnie data – do7 dni od daty wystawienia faktury (trigger sprawdza ten warunek). Przy rejestracji konkretnego zakupu (wstawieniu pozycji) trigger oblicza wartość sprzedawanego towaru (po ustaleniu jego ceny w tablicy TOWAR), dodaje tą kwotę do wartości całej faktury (aktualizując pole WARTOSC w tablicy FAKTURA) a także zmniejsza posiadaną ilość towaru aktualnie sprzedawanego (w tablicy TOWAR). Jeśli towar zostanie całkowicie wyprzedany lub jego zapas zmniejszył się poniżej ustalonego limitu, trigger komunikuje o tym fakcie.

10 Trigger, który ustala numer Klienta rejestrowanego w bazie, jeśli pole Nr_klienta nie jest incrementowane automatycznie: ALTER TRIGGER "Nadawanie numeru klienta" BEFORE INSERT ORDER 1 ON "DBA"."KLIENT" REFERENCING NEW AS nowy FOR EACH ROW BEGIN set nowy.nr_klienta= (select MAX(nr_klienta) from klient)+1 END

11 ALTER TRIGGER NOWA_FAKTURA BEFORE INSERT ORDER 1 ON FAKTURA REFERENCING NEW AS NOWA FOR EACH ROW BEGIN IF NOT EXISTS(SELECT * FROM KLIENT WHERE NR_KLIENTA=NOWA.NR_KLIENTA) THEN MESSAGE 'WPISZ NAJPIERW KLIENTA DO BAZY' TYPE ACTION TO CLIENT; ROLLBACK TRIGGER END IF; SET NOWA.NR_FAKTURY=(SELECT MAX(NR_FAKTURY) FROM FAKTURA)+1; SET NOWA.DATA_WYSTAWIENIA = NOW(); IF NOWA.DATA_PLATNOSCI IS NULL THEN SET NOWA.DATA_PLATNOSCI = NOW() ELSE IF NOWA.DATA_PLATNOSCI < NOW() OR NOWA.DATA_PLATNOSCI > (SELECT DATEADD (DAY, 7, NOW() ) ) THEN MESSAGE 'Bledna data, platnosc musi nastapic do 7 dni od daty wystawienia faktury' TYPE ACTION TO CLIENT; ROLLBACK TRIGGER END IF; END

12 ALTER TRIGGER NOWA_POZYCJA BEFORE INSERT ORDER 1 ON "DBA"."POZYCJA" REFERENCING NEW AS NOWA_POZ FOR EACH ROW BEGIN SET NOWA_POZ.WARTOSC_POZ=NOWA_POZ.ILOSC* (SELECT CENA_NETTO * ( 1 + VAT + MARZA )) FROM TOWAR WHERE KOD_T=NOWA_POZ.KOD_T); UPDATE TOWAR SET POSIADANA_ILOSC = POSIADANA_ILOSC – NOWA_POZ.ILOSC WHERE KOD_T=NOWA_POZ.KOD_T; IF (SELECT WARTOSC FROM FAKTURA WHERE NR_FAKTURY=NOWA_POZ.NR_FAKTURY) IS NULL THEN UPDATE FAKTURA SET WARTOSC=NOWA_POZ.WARTOSC_POZ WHERE NR_FAKTURY=NOWA_POZ.NR_FAKTURY; ELSE UPDATE FAKTURA SET WARTOSC=WARTOSC+ NOWA_POZ.WARTOSC_POZ WHERE NR_FAKTURY=NOWA_POZ.NR_FAKTURY END IF; MESSAGE 'Zaktualizowano stan towaru na magazynie i wartosc faktury' type action to client; END;

13 ALTER TRIGGER "sprawdzanie stanu" AFTER UPDATE ORDER 1 ON "DBA"."TOWAR" REFERENCING OLD AS PRZED NEW AS PO FOR EACH ROW BEGIN DECLARE NAZWA_BRAKU CHAR(20); SET NAZWA_BRAKU = (SELECT NAZWA_TOWARU FROM TOWAR WHERE KOD_T = PO.KOD_T); IF PO.POSIADANA_ILOSC = 0 THEN MESSAGE 'ZABRAKLO TOWARU: ',NAZWA_BRAKU TYPE ACTION TO CLIENT ELSE IF PO.POSIADANA_ILOSC < PO.MIN_ZAPAS THEN MESSAGE 'ILOSC TOWARU: ',NAZWA_BRAKU,' WYNOSI, PO.POSIADANA_ILOSC,' NORMA MINIMALNA TO ',PO.MIN_ZAPAS TYPE ACTION TO CLIENT END IF; end


Pobierz ppt "WYZWALACZE (TRIGGERY) Wyzwalacz jest specjalnym rodzajem procedury składowanej, która może być wykonana w odpowiedzi na jedną z trzech sytuacji: UPDATE."

Podobne prezentacje


Reklamy Google