13Wyzwalacze

4
Rozdzial 13 Procedury wyzwalane (c) Instytut Informatyki Politechniki Poznańskiej 1 procedury wyzwalane, cel stosowania, typy wyzwalaczy, wyzwalacze na poleceniach DML i DDL, wyzwalacze typu INSTEAD OF, przyklady zastosowania, zarządzanie wyzwalaczami 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. Typy procedur wyzwalanych: Procedury wyzwalane DML: BEFORE - uruchamiane przed wykonaniem polecenia INSERT, (c) Instytut Informatyki Politechniki Poznańskiej 2 BEFORE - uruchamiane przed wykonaniem polecenia INSERT, UPDATE, DELETE, AFTER - uruchamiane po wykonaniu polecenia INSERT, UPDATE, DELETE, INSTEAD OF – uruchamiane zamiast polecenia INSERT, UPDATE, DELETE, Systemowe procedury wyzwalane – uruchamiane po zajściu określonego zdarzenia w schemacie lub bazie danych Cele stosowania procedur wyzwalanych Zaawansowane śledzenie uŜytkowników Ochrona przed nieprawidlowymi transakcjami Wymuszanie więzów referencyjnych (albo więzów nie wspieranych przez deklaratywne więzy integralnościowe albo więzów między węzlami rozproszonej bazy danych) Wymuszanie zloŜonych regul biznesowych Wymuszanie zloŜonych polityk bezpieczeństwa (c) Instytut Informatyki Politechniki Poznańskiej 3 Wymuszanie zloŜonych polityk bezpieczeństwa Zapewnianie przezroczystego zapisu wydarzeń Wypelnianie atrybutów wartościami domyślnymi Modyfikacja zloŜonych perspektyw Śledzenie wydarzeń systemowych Definiowanie procedury wyzwalanej CREATE [OR REPLACE] TRIGGER nazwa { BEFORE | AFTER | INSTEAD OF } { INSERT | UPDATE | DELETE } ON { tabela | perspektywa } [ WHEN warunek ] [ FOR EACH ROW] [ DECLARE /* deklaracje zmiennych i kursorów */ ] BEGIN (c) Instytut Informatyki Politechniki Poznańskiej 4 INSTEAD OF: wyzwalacz moŜe być zdefiniowany tylko na perspektywie WHEN: wyzwalacz wykonuje się tylko dla tych krotek, dla których jest spelniony warunek FOR EACH ROW: wyzwalacz wykonuje się dla kaŜdej modyfikowanej krotki, tzw. wyzwalacz wierszowy BEGIN /* cialo procedury wyzwalanej */ END;

Transcript of 13Wyzwalacze

Page 1: 13Wyzwalacze

Rozdział 13Procedury wyzwalane

(c) Instytut Informatyki Politechniki Poznańskiej 1

procedury wyzwalane, cel stosowania, typy wyzwalaczy, wyzwalacze na poleceniach DML i DDL, wyzwalacze typu INSTEAD OF, przykłady

zastosowania, zarz ądzanie wyzwalaczami

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.

Typy procedur wyzwalanych:• Procedury wyzwalane DML:

• BEFORE - uruchamiane przed wykonaniem polecenia INSERT,

(c) Instytut Informatyki Politechniki Poznańskiej 2

• BEFORE - uruchamiane przed wykonaniem polecenia INSERT, UPDATE, DELETE,

• AFTER - uruchamiane po wykonaniu polecenia INSERT, UPDATE, DELETE,

• INSTEAD OF – uruchamiane zamiast polecenia INSERT, UPDATE, DELETE,

• Systemowe procedury wyzwalane – uruchamiane po zaj ściu okre ślonego zdarzenia w schemacie lub bazie danych

Cele stosowania procedur wyzwalanych

• Zaawansowane śledzenie u Ŝytkowników• Ochrona przed nieprawidłowymi transakcjami• Wymuszanie wi ęzów referencyjnych (albo wi ęzów nie wspieranych

przez deklaratywne wi ęzy integralno ściowe albo wi ęzów mi ędzy węzłami rozproszonej bazy danych)

• Wymuszanie zło Ŝonych reguł biznesowych• Wymuszanie zło Ŝonych polityk bezpiecze ństwa

(c) Instytut Informatyki Politechniki Poznańskiej 3

• Wymuszanie zło Ŝonych polityk bezpiecze ństwa• Zapewnianie przezroczystego zapisu wydarze ń

• Wypełnianie atrybutów warto ściami domy ślnymi• Modyfikacja zło Ŝonych perspektyw• Śledzenie wydarze ń systemowych

Definiowanie procedury wyzwalanej

CREATE [OR REPLACE] TRIGGER nazwa{ BEFORE | AFTER | INSTEAD OF }{ INSERT | UPDATE | DELETE } ON { tabela | perspekt ywa } [ WHEN warunek ] [ FOR EACH ROW][ DECLARE /* deklaracje zmiennych i kursorów */ ]BEGIN

(c) Instytut Informatyki Politechniki Poznańskiej 4

• INSTEAD OF: wyzwalacz mo Ŝe być zdefiniowany tylko na 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

BEGIN/* ciało procedury wyzwalanej */

END;

Page 2: 13Wyzwalacze

Definiowanie procedury wyzwalanej cd.Dla procedur wyzwalanych uruchamianych na skutek ua ktualnienia krotek, mo Ŝemy okre ślić list ę atrybutów relacji, których uaktualnienie uruchomi procedur ę.

Ta sama procedura mo Ŝe być wraŜliwa na kombinacj ę instrukcji DML (tj. INSERT, UPDATE, DELETE). ( niezgodne ze standardem)

CREATE OR REPLACE TRIGGER testAFTER UPDATE OF placa_pod, id_zesp ON pracownicy .. .

(c) Instytut Informatyki Politechniki Poznańskiej 5

DML (tj. INSERT, UPDATE, DELETE). ( niezgodne ze standardem)CREATE OR REPLACE TRIGGER testAFTER INSERT OR UPDATE OR DELETE ON pracownicyBEGIN

IF INSERTING THEN ...ELSIF UPDATING THEN ...ELSIF DELETING THEN ...END IF;

END;

Klauzula FOR EACH ROW i WHEN

CREATE OR REPLACE TRIGGER testBEFORE UPDATE ON pracownicyFOR EACH ROW WHEN (OLD.placa_dod < 100)BEGIN

IF (:NEW.placa_pod <= 100) THEN ... END IF;IF (:NEW.etat != :OLD.etat) THEN ... END IF;

END;

(c) Instytut Informatyki Politechniki Poznańskiej 6

• w klauzuli WHEN i ciele wyzwalacza FOR EACH ROW mo Ŝna uzyska ć dost ęp do starej i nowej warto ści atrybutu

• domy ślnie stara i nowa wersja rekordu s ą dost ępne przez nazwy OLD i NEW (w ciele wyzwalacza poprzedzane dwukropki em), moŜna to zmieni ć za pomoc ą klauzul REFERENCING OLD AS o i REFERENCING NEW AS n

• dla instrukcji INSERT stara warto ść jest pusta, dla instrukcji DELETE nowa warto ść jest pusta

END;

Przykład procedury wyzwalanej (1)

Poni Ŝsza procedura wyzwalana uruchamia si ę przed wstawieniem nowego pracownika i nadaje mu kolejny identyfikator pobierany z licznika (sekwencji)

CREATE OR REPLACE TRIGGER trig_id_pracBEFORE INSERT ON pracownicyFOR EACH ROW

(c) Instytut Informatyki Politechniki Poznańskiej 7

FOR EACH ROWBEGIN

IF (:NEW.id_prac IS NULL) THENSELECT seq_pracownik.NEXTVALINTO :NEW.id_prac FROM DUAL;

END IF;END;

Przykład procedury wyzwalanej (2)

Poni Ŝsza procedura sprawdza, czy płaca przyznana asysten towi nie przekracza widełek płacowych dla asystenta.

CREATE OR REPLACE TRIGGER trig_placa_asystentaBEFORE UPDATE OF placa_pod ON pracownicyFOR EACH ROWWHEN ( NEW.ETAT = 'ASYSTENT' )DECLAREv_max NUMBER; v_min NUMBER;

(c) Instytut Informatyki Politechniki Poznańskiej 8

v_max NUMBER; v_min NUMBER;BEGINSELECT placa_min, placa_max INTO v_min, v_maxFROM etaty WHERE nazwa = :NEW.etat;IF :NEW.placa_pod NOT BETWEEN v_min AND v_max THENRAISE_APPLICATION_ERROR(-20001,'Za wysoka placa');

END IF;END;

Page 3: 13Wyzwalacze

Procedura wyzwalana INSTEAD OF

Pozwala na zapewnianie modyfikowalno ści zło Ŝonych perspektyw.

CREATE OR REPLACE VIEW zesp_count ASSELECT nazwa, count(id_prac) AS pracownicyFROM pracownicy RIGHT JOIN zespoly USING (id_zesp)GROUP BY nazwa;

(c) Instytut Informatyki Politechniki Poznańskiej 9

CREATE OR REPLACE TRIGGER trig_insteadINSTEAD OF INSERT ON zesp_countFOR EACH ROWBEGININSERT INTO zespoly(id_zesp,nazwa,adres)VALUES(seq_zesp.NEXTVAL,:NEW.nazwa,NULL);

END;

Przykład systemowej procedury wyzwalanej

Procedura wpisuje do tabeli HISTORY dat ę utworzenia, typ i nazw ę kaŜdego obiektu tworzonego wewn ątrz bie Ŝącego schematu.

CREATE TABLE HISTORY (CR_DATE DATE,CR_OBJECT VARCHAR2(50),CR_NAME VARCHAR2(50));

(c) Instytut Informatyki Politechniki Poznańskiej 10

CR_NAME VARCHAR2(50));

CREATE OR REPLACE TRIGGER TR_SCHEMAAFTER CREATE ON SCHEMABEGININSERT INTO HISTORY(CR_DATE,CR_OBJECT,CR_NAME)VALUES (SYSDATE, ORA_DICT_OBJ_TYPE, ORA_DICT_OBJ_NA ME);

END;

Ograniczenia wierszowych procedur wyzwalanych

• Wyzwalacz wierszowy nie mo Ŝe wykonywa ć zapytań i modyfikowa ć relacji, na której został zało Ŝony – zapobiega to odczytowi przez wyzwalacz niespójnych danych (ogran iczenie to nie dotyczy wyzwalaczy INSTEAD OF)

CREATE TRIGGER PoliczPracownikowAFTER DELETE ON pracownicyFOR EACH ROW

DECLARE

(c) Instytut Informatyki Politechniki Poznańskiej 11

DECLAREv_ilu NUMBER(5);

BEGINSELECT COUNT(*) INTO v_ilu FROM pracownicy;dbms_output.put_line('Liczba pracowników: '||v_ilu);

END;

SQL> DELETE pracownicy WHERE nazwisko = 'HAPKE';ORA-04091: tabela SCOTT.PRACOWNICY ulega mutacji, wyzwalacz/funkcja mo Ŝe tego nie widzie ć

Zarządzanie procedurami wyzwalanymi

• Wszystkie procedury wyzwalane zwi ązane z daną relacj ą moŜna zablokowa ć (odblokowa ć) pojedynczym poleceniem:

• KaŜda procedura wyzwalana mo Ŝe być w jednym z dwóchstanów: odblokowania lub zablokowania. Do zablokowania(odblokowania) pojedynczej procedury wyzwalanej słu Ŝy

ALTER TABLE nazwa_relacji DISABLE [ENABLE] ALL TRIGGERS;

(c) Instytut Informatyki Politechniki Poznańskiej 12

(odblokowania) pojedynczej procedury wyzwalanej słu Ŝypolecenie:

• Do usuni ęcie wyzwalacza słu Ŝy polecenie

ALTER TRIGGER nazwa DISABLE [ENABLE];

DROP TRIGGER nazwa;

Page 4: 13Wyzwalacze

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

Słownik bazy danych

SELECT TRIGGER_NAME, TRIGGER_TYPE, TRIGGERING_EVENT, TABLE_NAME, TRIGGER_BODY

(c) Instytut Informatyki Politechniki Poznańskiej 13

TABLE_NAME, TRIGGER_BODYFROM USER_TRIGGERS;

SELECT NAME, TYPE, REFERENCED_TYPEFROM USER_DEPENDENCIESWHERE REFERENCED_NAME = 'PRACOWNICY';