Title: Rozdzial 11: Procedury wyzwalane (triggery)
1Rozdzial 11 Procedury wyzwalane (triggery)
(c) 1999, Instytut Informatyki Politechniki
Poznanskiej
2Procedura wyzwalana
- procedura wyzwalana (ang. trigger) reaguje na
zdarzenia zachodzace w bazie danych - typy procedur wyzwalanych
- BEFORE - uruchamiane przed wykonaniem polecenia
- INSERT, UPDATE, DELETE
- AFTER - uruchamiane po wykonaniu polecenia
- INSERT, UPDATE, DELETE
- FOR EACH ROW - uruchamiane dla kazdej krotki,
której dotyczy polecenie DML - poziom krotki - uruchamiane jednorazowo dla polecenia DML
(niezaleznie od liczby krotek, której ono
dotyczy) - poziom relacji
(c) 1999, Instytut Informatyki Politechniki
Poznanskiej
3Definiowanie procedury wyzwalanej
CREATE OR REPLACE TRIGGER test AFTER DELETE ON
pracownicy BEGIN / cialo procedury wyzwalanej
/ dbms_output.put_line('Krotka relacji
zostala usunieta) END
(c) 1999, Instytut Informatyki Politechniki
Poznanskiej
4Definiowanie procedury wyzwalanej cd.
- Dla procedur wyzwalanych uruchamianych na skutek
uaktualnienia krotek, mozemy okreslic liste
atrybutów relacji, których uaktualnienie uruchomi
procedure. Jesli nie podamy listy atrybutów,
procedura bedzie uruchamiana w wyniku
uaktualnienia dowolnego sposród atrybutów
relacji. - Ta sama procedura moze byc uruchomiona przez
kazde sposród trzech polecen DML (tj. INSERT,
UPDATE, DELETE) lub ich dowolna kombinacje.
CREATE OR REPLACE TRIGGER test AFTER UPDATE OF
placa_pod, id_zesp ON pracownicy ...
CREATE OR REPLACE TRIGGER test AFTER INSERT OR
UPDATE OR DELETE ON pracownicy ...
(c) 1999, Instytut Informatyki Politechniki
Poznanskiej
5Klauzula FOR EACH ROW i WHEN
CREATE OR REPLACE TRIGGER test BEFORE UPDATE ON
pracownicy FOR EACH ROW WHEN (OLD.placa_dod lt
100) BEGIN ... END
- w klauzuli WHEN mozna stosowac operatory
matematyczne, SQL i logiczne, np. - wartosci atrybutów testujemy w nastepujacy sposób
(OLD.placa_dod gt30 AND OLD.placa_pod lt100)
IF NEW.placa_podlt100 THEN ...
(c) 1999, Instytut Informatyki Politechniki
Poznanskiej
6Procedury wyzwalane - przyklad 1
- zdefiniuj procedure wyzwalana nadajaca nowemu
pracownikowi kolejny numer - pobierany z licznika
create or replace trigger generuj_numer before
insert on pracownicy for each row begin if
new.id_prac is null then select
seq_pracownik.nextval into new.id_prac from
dual end if end
(c) 1999, Instytut Informatyki Politechniki
Poznanskiej
7Procedury wyzwalane - przyklad 2
- zdefiniuj procedure wyzwalana, która uniemozliwi
zmniejszanie placy podstawowej pracowników (do
wyswietlania stosownego komunikatu skorzystaj z
procedury raise_application_error).
create trigger polityka_placowa before update of
placa_pod on pracownicy for each row when
(new.placa_pod lt old.placa_pod) begin raise_appli
cation_error (-25000, 'Niebezpieczenstwo
strajku') end polityka_placowa
(c) 1999, Instytut Informatyki Politechniki
Poznanskiej
8Zablokowanie i odblokowanie procedury wyzwalanej
- Kazda procedura wyzwalana moze byc w jednym z
dwóch stanów odblokowania lub zablokowania. Do
zablokowania (odblokowania) pojedynczej procedury
wyzwalanej sluzy polecenie
ALTER TRIGGER nazwa DISABLE ENABLE
- Wszystkie procedury wyzwalane zwiazane z dana
relacja mozna zablokowac (odblokowac) pojedynczym
poleceniem
ALTER TABLE nazwa_relacji DISABLE ENABLE ALL
TRIGGERS
(c) 1999, Instytut Informatyki Politechniki
Poznanskiej
9Usuwanie procedury wyzwalanej
DROP TRIGGER nazwa
Slownik bazy danych
- informacje dotyczace procedur wyzwalanych
zdefiniowanych przez uzytkownika mozna wyswietlic
korzystajac z perspektywy systemowej o nazwie
USER_TRIGGERS
(c) 1999, Instytut Informatyki Politechniki
Poznanskiej