You are on page 1of 4

Procedury wyzwalane

Procedura wyzwalana (ang. trigger) to program w języku PL/SQL


(równieŜ Java lub C) który reaguje na zdarzenia zachodzące w bazie
danych i wykonuje się po zajściu określonych warunków.

Rozdział 13 Typy procedur wyzwalanych:


Procedury wyzwalane • Procedury wyzwalane DML:
• BEFORE - uruchamiane przed wykonaniem polecenia INSERT,
UPDATE, DELETE,
procedury wyzwalane, cel stosowania, typy • AFTER - uruchamiane po wykonaniu polecenia INSERT, UPDATE,
wyzwalaczy, wyzwalacze na poleceniach DML i DELETE,
DDL, wyzwalacze typu INSTEAD OF, przykłady • INSTEAD OF – uruchamiane zamiast polecenia INSERT, UPDATE,
zastosowania, zarządzanie wyzwalaczami DELETE,
• Systemowe procedury wyzwalane – uruchamiane po zajściu
określonego zdarzenia w schemacie lub bazie danych

(c) Instytut Informatyki Politechniki Poznańskiej 1 (c) Instytut Informatyki Politechniki Poznańskiej 2

Cele stosowania procedur wyzwalanych Definiowanie procedury wyzwalanej


CREATE [OR REPLACE] TRIGGER nazwa
• Zaawansowane śledzenie uŜytkowników
{ BEFORE | AFTER | INSTEAD OF }
• Ochrona przed nieprawidłowymi transakcjami
{ INSERT | UPDATE | DELETE } ON { tabela | perspektywa }
• Wymuszanie więzów referencyjnych (albo więzów nie wspieranych
[ WHEN warunek ]
przez deklaratywne więzy integralnościowe albo więzów między
węzłami rozproszonej bazy danych) [ FOR EACH ROW]
• Wymuszanie złoŜonych reguł biznesowych [ DECLARE /* deklaracje zmiennych i kursorów */ ]
• Wymuszanie złoŜonych polityk bezpieczeństwa BEGIN
• Zapewnianie przezroczystego zapisu wydarzeń /* ciało procedury wyzwalanej */
• Wypełnianie atrybutów wartościami domyślnymi END;
• Modyfikacja złoŜonych perspektyw • INSTEAD OF: wyzwalacz moŜe być zdefiniowany tylko na
• Śledzenie wydarzeń systemowych perspektywie
• WHEN: wyzwalacz wykonuje się tylko dla tych krotek, dla których
jest spełniony warunek
• FOR EACH ROW: wyzwalacz wykonuje się dla kaŜdej
modyfikowanej krotki, tzw. wyzwalacz wierszowy
(c) Instytut Informatyki Politechniki Poznańskiej 3 (c) Instytut Informatyki Politechniki Poznańskiej 4
Definiowanie procedury wyzwalanej cd. Klauzula FOR EACH ROW i WHEN
Dla procedur wyzwalanych uruchamianych na skutek uaktualnienia
krotek, moŜemy określić listę atrybutów relacji, których CREATE OR REPLACE TRIGGER test
uaktualnienie uruchomi procedurę. BEFORE UPDATE ON pracownicy
FOR EACH ROW WHEN (OLD.placa_dod < 100)
CREATE OR REPLACE TRIGGER test
BEGIN
AFTER UPDATE OF placa_pod, id_zesp ON pracownicy ...
IF (:NEW.placa_pod <= 100) THEN ... END IF;
Ta sama procedura moŜe być wraŜliwa na kombinację instrukcji IF (:NEW.etat != :OLD.etat) THEN ... END IF;
DML (tj. INSERT, UPDATE, DELETE). (niezgodne ze standardem) END;
CREATE OR REPLACE TRIGGER test
• w klauzuli WHEN i ciele wyzwalacza FOR EACH ROW moŜna
AFTER INSERT OR UPDATE OR DELETE ON pracownicy
uzyskać dostęp do starej i nowej wartości atrybutu
BEGIN
• domyślnie stara i nowa wersja rekordu są dostępne przez nazwy
IF INSERTING THEN ...
OLD i NEW (w ciele wyzwalacza poprzedzane dwukropkiem),
ELSIF UPDATING THEN ... moŜna to zmienić za pomocą klauzul REFERENCING OLD AS o i
ELSIF DELETING THEN ... REFERENCING NEW AS n
END IF; • dla instrukcji INSERT stara wartość jest pusta, dla instrukcji
END; DELETE nowa wartość jest pusta
(c) Instytut Informatyki Politechniki Poznańskiej 5 (c) Instytut Informatyki Politechniki Poznańskiej 6

Przykład procedury wyzwalanej (1) Przykład procedury wyzwalanej (2)


PoniŜsza procedura sprawdza, czy płaca przyznana asystentowi nie
PoniŜsza procedura wyzwalana uruchamia się przed wstawieniem przekracza widełek płacowych dla asystenta.
nowego pracownika i nadaje mu kolejny identyfikator pobierany z
CREATE OR REPLACE TRIGGER trig_placa_asystenta
licznika (sekwencji)
BEFORE UPDATE OF placa_pod ON pracownicy
FOR EACH ROW
CREATE OR REPLACE TRIGGER trig_id_prac
WHEN ( NEW.ETAT = 'ASYSTENT' )
BEFORE INSERT ON pracownicy
DECLARE
FOR EACH ROW
v_max NUMBER; v_min NUMBER;
BEGIN BEGIN
IF (:NEW.id_prac IS NULL) THEN SELECT placa_min, placa_max INTO v_min, v_max
SELECT seq_pracownik.NEXTVAL FROM etaty WHERE nazwa = :NEW.etat;
INTO :NEW.id_prac FROM DUAL; IF :NEW.placa_pod NOT BETWEEN v_min AND v_max THEN
END IF; RAISE_APPLICATION_ERROR(-20001,'Za wysoka placa');
END; END IF;
END;

(c) Instytut Informatyki Politechniki Poznańskiej 7 (c) Instytut Informatyki Politechniki Poznańskiej 8
Procedura wyzwalana INSTEAD OF Przykład systemowej procedury wyzwalanej

Pozwala na zapewnianie modyfikowalności złoŜonych perspektyw. Procedura wpisuje do tabeli HISTORY datę utworzenia, typ i nazwę
kaŜdego obiektu tworzonego wewnątrz bieŜącego schematu.
CREATE OR REPLACE VIEW zesp_count AS
SELECT nazwa, count(id_prac) AS pracownicy CREATE TABLE HISTORY (
FROM pracownicy RIGHT JOIN zespoly USING (id_zesp) CR_DATE DATE,
GROUP BY nazwa; CR_OBJECT VARCHAR2(50),
CR_NAME VARCHAR2(50));
CREATE OR REPLACE TRIGGER trig_instead
INSTEAD OF INSERT ON zesp_count CREATE OR REPLACE TRIGGER TR_SCHEMA
FOR EACH ROW AFTER CREATE ON SCHEMA
BEGIN BEGIN
INSERT INTO HISTORY(CR_DATE,CR_OBJECT,CR_NAME)
INSERT INTO zespoly(id_zesp,nazwa,adres)
VALUES (SYSDATE, ORA_DICT_OBJ_TYPE, ORA_DICT_OBJ_NAME);
VALUES(seq_zesp.NEXTVAL,:NEW.nazwa,NULL);
END;
END;

(c) Instytut Informatyki Politechniki Poznańskiej 9 (c) Instytut Informatyki Politechniki Poznańskiej 10

Ograniczenia wierszowych procedur wyzwalanych Zarządzanie procedurami wyzwalanymi


• Wyzwalacz wierszowy nie moŜe wykonywać zapytań i • Wszystkie procedury wyzwalane związane z daną relacją moŜna
modyfikować relacji, na której został załoŜony – zapobiega to zablokować (odblokować) pojedynczym poleceniem:
odczytowi przez wyzwalacz niespójnych danych (ograniczenie to
nie dotyczy wyzwalaczy INSTEAD OF) ALTER TABLE nazwa_relacji
DISABLE [ENABLE] ALL TRIGGERS;
CREATE TRIGGER PoliczPracownikow
AFTER DELETE ON pracownicy
• KaŜda procedura wyzwalana moŜe być w jednym z dwóch
FOR EACH ROW
stanów: odblokowania lub zablokowania. Do zablokowania
DECLARE
(odblokowania) pojedynczej procedury wyzwalanej słuŜy
v_ilu NUMBER(5); polecenie:
BEGIN
SELECT COUNT(*) INTO v_ilu FROM pracownicy; ALTER TRIGGER nazwa DISABLE [ENABLE];
dbms_output.put_line('Liczba pracowników: '||v_ilu);
END;
• Do usunięcie wyzwalacza słuŜy polecenie
SQL> DELETE pracownicy WHERE nazwisko = 'HAPKE';
ORA-04091: tabela SCOTT.PRACOWNICY ulega mutacji, DROP TRIGGER nazwa;
wyzwalacz/funkcja moŜe tego nie widzieć

(c) Instytut Informatyki Politechniki Poznańskiej 11 (c) Instytut Informatyki Politechniki Poznańskiej 12
Słownik bazy danych
Informacje o procedurach wyzwalanych uŜytkownika
mieszczą się w perspektywie systemowej USER_TRIGGERS

Informacje o zaleŜnościach moŜna podejrzeć w perspektywie


słownika bazy danych USER_DEPENDENCIES

SELECT TRIGGER_NAME, TRIGGER_TYPE, TRIGGERING_EVENT,


TABLE_NAME, TRIGGER_BODY
FROM USER_TRIGGERS;

SELECT NAME, TYPE, REFERENCED_TYPE


FROM USER_DEPENDENCIES
WHERE REFERENCED_NAME = 'PRACOWNICY';

(c) Instytut Informatyki Politechniki Poznańskiej 13

You might also like