Procedury wyzwalane Procedura wyzwalana (ang. trigger) - stanowi kod użytkownika przechowywany wewnątrz bazy i uruchamiany w określonych sytuacjach np. przed/po wykonaniu zapytania : aktualizującego dane w bazie usuwającego dane z bazy wprowadzającego nowe dane do bazy działają na najniższym poziomie dostępu do bazy są bardzo ważnym narzędziem pozwalającym utrzymać integralność referencyjną bazy.
Procedury wyzwalane Procedury wyzwalane używają tabel wirtualnych Inserted Deleted o takiej samej strukturze jak struktura tabeli aktualizowanej. Jeżeli dodawany jest nowy wiersz do tabeli aktualizowanej, wpis rejestrowany jest w tabeli bazowej jak i w tabeli Inserted Gdy dane są usuwane, usunięty rekord przechowywany jest w tabeli Deleted
Typy procedur wyzwalanych Możemy dokonać podziału wg sposobu uruchamiania: uruchamiane: przed (BEFORE) zdarzeniem po (AFTER) zdarzeniu DML (INSERT, UPDATE, DELETE) - na tabelach uruchamiane zdarzeniem DDL (CREATE, ALTER, DROP) uruchamiane zamiast zdarzenia INSTEAD OF ... - powodującego wywołanie - na perspektywach uruchamiane po zajściu określonego zdarzenia w schemacie lub bazie danych SYSTEMOWE
Częstotliwość uruchamiania Możemy dokonać podziału wg częstotliwości uruchamiania: uruchamiane dla każdej krotki (wyzwalacz poziomu-wierszy), której dotyczy zdarzenie FOR EACH ROW (tylko dla zdarzeń DML i INSTEAD OF) uruchamiane jednorazowo (wyzwalacz poziomu-instrukcji) dla zdarzenia - niezależnie od liczby krotek, którego ono dotyczy wykonuje się jeden raz przy instrukcji powodującej jedno lub więcej zdarzeń wyzwalacza. (nie dotyczy INSTEAD OF)
Przykładowe zastosowania wyzwalaczy Wysyłanie do użytkowników systemu natychmiastowych komunikatów (np. email) o zajściu określonych zdarzeń, np. o przekroczeniu limitów kredytu o przekroczeniu limitów stanów magazynowych o wprowadzeniu transakcji oczekujących na autoryzację Dynamiczne modyfikowanie danych z natury statycznych, np. limitów kredytu statusów sektorów w magazynie składników polityki zapasów Modyfikacja funkcji, np. naliczania terminu płatności poprzez uwzględnienie dni wolnych od pracy i świąt
Przykładowe rozwiązania zastosowania wyzwalaczy Stworzenie funkcji nieistniejących, np. rozliczeni kosztów dodatkowych w module zarządzania powierzchnią magazynową, Dodatkowe rejestrowanie informacji o modyfikacjach w bazie danych ułatwiających ustalenie autora i czasu oraz zakresu modyfikowanej informacji. Wypełnianie atrybutów wartościami domyślnymi Śledzenie wydarzeń systemowych Modyfikacja złożonych perspektyw
Specyfika wykorzystania procedur wyzwalanych Procedury wyzwalane reagują - ograniczenia zapobiegają Procedury wyzwalane uruchamiane są tylko wtedy, gdy na tabeli zostanie wykonana określona operacja. Ograniczenia sprawdzane są w pierwszej kolejności sprawdzenie ograniczeń (jeśli w tabeli z procedurami wyzwalanymi zdefiniowano ograniczenia) jeśli ograniczenie zostanie przekroczone, to procedura wyzwalana nie zostanie uruchomiona. Tabele mogą mieć wiele procedur wyzwalanych w tabeli można zdefiniować wiele procedur wyzwalanych dla każdej akcji jedną procedurę dla wszystkich akcji.
Specyfika wykorzystania procedur wyzwalanych Właściciel tabeli musi mieć prawo do realizacji wszystkich poleceń, zawartych w procedurach wyzwalanych może tworzyć i usuwać procedury wyzwalane ma prawo do realizacji wszystkich instrukcji zawartych w procedurze wyzwalanej, w stosunku do wszystkich wykorzystywanych tabel. nie może przekazywać praw Procedur wyzwalanych nie można wiązać z tabelami tymczasowymi i widokami. (Mogą się do nich odwoływać)
Definiowanie procedury wyzwalanej CREATE [OR REPLACE] TRIGGER nazwa_triggera {BEFORE | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE} ON {tabela | perspektywa} [WHEN warunek ] [FOR EACH ROW] [DECLARE /* deklaracje zmiennych*/] BEGIN /* ciało procedury wyzwalanej */ END;
Definiowanie procedury wyzwalanej Dla procedur wyzwalanych uruchamianych na skutek uaktualnienia krotek, możemy określić listę atrybutów relacji, których uaktualnienie uruchomi procedurę. Jeśli nie podamy listy atrybutów, procedura będzie uruchamiana w wyniku uaktualnienia dowolnego spośród atrybutów relacji. Przykład CREATE OR REPLACE TRIGGER nazwa_trigger AFTER UPDATE OF imie, nazwisko ON student ...
Definiowanie procedury wyzwalanej Ta sama procedura może być uruchomiona przez każde spośród trzech poleceń DML (tj. INSERT, UPDATE, DELETE) lub ich dowolną kombinację. Przykład 1 CREATE OR REPLACE TRIGGER nazwa_trigger AFTER INSERT ON student... Przykład 2 AFTER INSERT OR UPDATE OR DELETE ON student...
Warunki i atrybuty CREATE OR REPLACE TRIGGER nazwa_trigger BEFORE UPDATE ON student FOR EACH ROW WHEN (OLD.srednia < 4) BEGIN ... END; w klauzuli WHEN można stosować operatory: matematyczne SQL logiczne (OLD.srednia>4 AND OLD.srednia<5) wartości atrybutów testujemy w następujący sposób: IF :NEW.srednia<=4.5 THEN... ;
Przykład procedury wyzwalanej 1 Poniższa procedura wyzwalana, sprawdza czy wypożyczane auto jest aktualnie na stanie (podobnie w przypadku wypożyczania książek – baza danych biblioteka) CREATE TRIGGER juz_wypozyczony ON wypozyczalnia FOR INSERT AS IF(SELECT COUNT(*) FROM wypozyczalnia, INSERTED WHERE wypozyczalnia.nr_samochodu=INSERTED.nr_samochodu AND wypozyczalnia.data_odd IS NULL)>=1 COMMIT TRANSACTION ELSE BEGIN PRINT ‘samochód jeszcze nie oddany’ ROLLBACK TRANSACTION END
Przykład procedury wyzwalanej 2 Generowanie jednoznacznego identyfikatora, wstawianego do jednego z pól przy wykonywaniu instrukcji INSERT. CREATE [OR REPLACE] TRIGGER generuj_id_studenta BEFORE INSERT ON student FOR EACH ROW BEGIN IF (:NEW.id_student IS NULL) THEN SELECT seq_student.NEXTVAL INTO :NEW.id_student FROM DUAL; END IF; END;
Przykład procedury wyzwalanej 3 Utrzymywanie zarobków w przedziale wartości, w zależności od stanowiska. CREATE TRIGGER sprawdzenie_zarobkow BEFORE INSERT OR UPDATE OF Zarobki, Stanowisko ON Pracownicy FOR EACH ROW DECLARE Minimum NUMBER; Maksimum NUMBER; BEGIN /* Znalezienie zakresu zarobków na danym stanowisku */ SELECT Min_zar, Max_zar INTO Minimum, Maksimum FROM Widełki WHERE Stanowisko = :NEW. Stanowisko; /* Jeżeli zarobki spoza zakresu, generuj błąd */ IF :NEW.Zarobki < Minimum OR :NEW.Zarobki > Maksimum THEN Raise_application_error(-20500,'Zarobki '|| : NEW. Zarobki ||' spoza zakresu ' ) ; END IF; END; /* Koniec wyzwalacza */
Przykład procedury wyzwalanej 4 Akcja jest wyzwalana przy próbie modyfikacji atrybutu cena. W wyniku powinna zostać uniemożliwiona każda próba obniżenia ceny. CREATE TRIGGER zmiany_cen AFTER UPDATE OF cena ON cennik REFERENCING OLD AS StaraKrotka NEW AS NowaKrotka WHEN (StaraKrotka.cena > NowaKrotka.cena) UPDATE cennik SET cena = StaraKrotka.cena WHERE cert# = NowaKrotka.cert# FOR EACH ROW ;
Zarządzanie procedurami wyzwalanymi Wszystkie procedury wyzwalane związane z daną relacją można zablokować (odblokować) pojedynczym poleceniem: ALTER TABLE nazwa_relacji DISABLE [ENABLE] ALL TRIGGERS; Każda procedura wyzwalana może być w jednym z dwóch stanów: odblokowania lub zablokowania. Do zablokowania (odblokowania) pojedynczej procedury wyzwalanej służy polecenie: ALTER TRIGGER nazwa_triggera DISABLE[ENABLE]; Wyzwalacz może zostać usunięty przy pomocy instrukcji: DROP TRIGGER nazwa_triggera;
Informacja o wyzwalaczach Informacje o wyzwalaczach znajdują się w perspektywie słownika danych User_triggers. Aby je obejrzeć piszemy: SELECT Trigger_type, Table_name, Triggering_event FROM User_triggers WHERE Trigger_name = 'wyzwalacz'; lub SELECT Trigger_body *(nazwę wyzwalacza piszemy dużymi literami)
Dziękuję :)