Procedury wyzwalane. Rozdział 13. Procedury wyzwalane. Cele stosowania procedur wyzwalanych. Definiowanie procedury wyzwalanej DML

Podobne dokumenty
Język PL/SQL. Rozdział 6. Procedury wyzwalane

Procedury wyzwalane. (c) Instytut Informatyki Politechniki Poznańskiej 1

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia

1. Wyzwalacze BD (ang. triggers)

Używany kiedy pełna treść instrukcji SQL jest nieznana przed uruchomieniem programu.

Oracle PL/SQL. Paweł Rajba.

Plan wykładu BAZY DANYCH II WYKŁAD 8. Wyzwalacze. Wyzwalacze

PODSTAWY BAZ DANYCH 13. PL/SQL

Wyzwalacze TWORZENIE WYZWALACZY

BAZY DANYCH W APLIKACJACH SIECIOWYCH

Zaawansowane bazy danych i hurtownie danych semestr I

Instrukcja podwaja zarobki osób, których imiona zaczynają się P i dalsze litery alfabetu zakładamy, że takich osbób jest kilkanaście.

Wyzwalacze. do automatycznego generowania wartości kluczy głównych. Składnia instrukcji tworzacej wyzwalacz

Bazy danych, 4. wiczenia

Cele. Definiowanie wyzwalaczy

Język SQL. Rozdział 8. Język manipulowania danymi DML

Tworzenie widoku CREATE OR REPLACE VIEW [nazwa_widoku] AS SELECT [nazwy_kolumn] FROM [nazwa_tablicy];

Bazy danych wykład szósty Więzy i wyzwalacze. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

PL/SQL. Zaawansowane tematy PL/SQL. Piotr Medoń

Język SQL. Rozdział 10. Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne.

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

Język SQL. Rozdział 9. Język definiowania danych DDL, część 2.

Cheatsheet PL/SQL Andrzej Klusiewicz 1/9

Wyzwalacze. Anna Fiedorowicz Bazy danych 2

Procedury i funkcje składowane

Język PL/SQL. Rozdział 5. Pakiety podprogramów. Dynamiczny SQL

Pakiety podprogramów Dynamiczny SQL

Język PL/SQL. Rozdział 2. Kursory

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ];

SQL> startup pfile=./admin/pfile/initdbx.ora. SQL> create spfile from pfile='$home/admin/pfile/initdbx.ora' create user bolek identified by bolek;

Ćwiczenie 13 PL/SQL. Język PL/SQL procedury, funkcje, pakiety, wyzwalacze

Język PL/SQL Procedury i funkcje składowane

Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne, perspektywy wbudowane.

Administracja i programowanie pod Microsoft SQL Server 2000

Widok Connections po utworzeniu połączenia. Obszar roboczy

Język SQL. Rozdział 8. Język manipulowania danymi DML zadania

Język SQL. Rozdział 5. Połączenia i operatory zbiorowe

Plan wykładu BAZY DANYCH II WYKŁAD 3. Zasięg zmiennych. Zasięg zmiennych

Plan bazy: Kod zakładający bazę danych: DROP TABLE noclegi CASCADE; CREATE TABLE noclegi( id_noclegu SERIAL NOT NULL,

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

Kursor jawny. Rozdział 10a Kursory. Deklarowanie kursora (1) Deklarowanie kursora (2)

Aspekty aktywne baz danych

Kolekcje Zbiory obiektów, rodzaje: tablica o zmiennym rozmiarze (ang. varray) (1) (2) (3) (4) (5) Rozszerzenie obiektowe w SZBD Oracle

1: 2: 3: 4: 5: 6: 7: 8: 9: 10:

Bazy Danych i Usługi Sieciowe

UPDATE Studenci SET Rok = Rok + 1 WHERE Rodzaj_studiow =' INŻ_ST'; UPDATE Studenci SET Rok = Rok 1 WHERE Nr_albumu IN ( '111345','100678');

Deklarowanie kursora

Bloki anonimowe w PL/SQL

Bazy danych i usługi sieciowe

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Język SQL. Rozdział 2. Proste zapytania

Kursor. Rozdział 10a Kursory. Otwieranie kursora. Deklarowanie kursora

w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze

BAZA DANYCH SIECI HOTELI

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

Kursory i wyjątki. (c) Instytut Informatyki Politechniki Poznańskiej 1

3 Przygotowali: mgr inż. Barbara Łukawska, mgr inż. Maciej Lasota

Indeksy. Indeks typu B drzewo

Systemowe aspekty baz

Struktura bazy danych

Wykład 5 funkcje i procedury pamiętane widoki (perspektywy) wyzwalacze

Ćwiczenie 13 PL/SQL. Język PL/SQL procedury, funkcje, pakiety, wyzwalacze

ORACLE (Wykład 1) aragorn.pb.bialystok.pl/~aonisko. Typy rozproszonych baz danych. Systemy klient-serwer. Klient-serwer: Przykład

SQL 4 Structured Query Lenguage

Uprawnienia, role, synonimy

Składowane procedury i funkcje

Bazy danych wykład dwunasty PL/SQL, c.d. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

E.14 Bazy Danych cz. 18 SQL Funkcje, procedury składowane i wyzwalacze

Wprowadzenie do BD Operacje na bazie i tabelach Co poza zapytaniami? Algebra relacji. Bazy Danych i Systemy informacyjne Wykład 2.

Wyzwalacze (triggery) Przykład

SQL do zaawansowanych analiz danych część 1.

Hurtownia Świętego Mikołaja projekt bazy danych

Relacyjne bazy danych. Podstawy SQL

PL/SQL. Zaawansowane tematy PL/SQL

Tworzenie tabeli przez select CREATE TABLE PRAC2 AS SELECT P.NAZWISKO, Z.NAZWA FROM PRAC P NATURAL JOIN ZESP Z

Plan ćwiczenia. Rozdział 16 Uwierzytelnianie i autoryzacja w bazie danych. Użytkownicy i schematy (1) Użytkownicy i schematy (2) baza danych: ZESP99

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

Bazy danych - Materiały do laboratoriów VIII

Systemowe aspekty baz danych

1. ELEMENTY JĘZYKA PL/SQL

SQL DDL DML TECHNOLOGIE BAZ DANYCH. Wykład 5: Język DDL i DML. Małgorzata Krętowska

Język SQL. Rozdział 7. Zaawansowane mechanizmy w zapytaniach

Oracle PL/SQL. Paweł Rajba.

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów

Materiały. Technologie baz danych. Plan wykładu Kursory. Wykład 5: Kursory jawne. Podprogramy. Kursory jawne. Kursory niejawne

Deklarowanie kursora. CURSOR nazwa [ ( param1 typ1 [,param2 typ2]... ) ] [RETURN typ zwracany] IS zapytanie SQL;

Wykład IV Modelowanie danych, projektowanie systemu informatycznego Modelowanie konceptualne implementacyjne Modelowanie pojęciowe na encjach

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

Zaawansowane bazy danych i hurtownie danych semestr I, st. niestacjonarne

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

Typy Oracle atrybutów relacji Typ NUMBER (1)

Oracle11g: Wprowadzenie do SQL

Typy Oracle atrybutów relacji Typ NUMBER (1)

Modelowanie wymiarów

Procedury składowane. Funkcje vs. procedury Funkcja. Procedura. zazwyczaj ma parametry tylko typu IN; można wywoływać z poziomu

15. Funkcje i procedury składowane PL/SQL

kończy wysyłanie danych do pliku tworzy strukturę tabeli wyświetla opis struktury tabeli zmiana nazwy tabeli usuwanie tabeli

Język SQL. Rozdział 4. Funkcje grupowe Funkcje grupowe, podział relacji na grupy, klauzule GROUP BY i HAVING.

Trigger jest obiektem związanym z tablicą, który aktywuje się gdy do tablicy następuje odpowiednie zapytanie.

Transkrypt:

Procedury wyzwalane Rozdział 13 Procedury wyzwalane procedury wyzwalane, cel stosowania, typy wyzwalaczy, wyzwalacze na poleceniach DML i DDL, wyzwalacze typu INSTEAD OF, przykłady zastosowania, zarządzanie wyzwalaczami 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. Podział: Procedury wyzwalane DML: BEFORE-uruchamiane przed wykonaniem polecenia INSERT, UPDATE, DELETE, AFTER- uruchamiane po wykonaniu polecenia INSERT, UPDATE, DELETE, INSTEAD OF uruchamiane zamiast polecenia INSERT, UPDATE, DELETE, wykonywanego na rzecz perspektywy Procedury wyzwalane DDL. Procedury wyzwalane zdarzeniami systemowymi np. uruchomienie lub zatrzymanie bazy danych, przyłączenie się użytkownika do bazy danych, pojawianie się zdarzenia blokującego operację (brak dostępnego miejsca w przestrzeni tabel) itp. 1 2 Cele stosowania procedur wyzwalanych Definiowanie procedury wyzwalanej DML 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 Zapewnianie przezroczystego zapisu wydarzeń Wypełnianie atrybutów wartościami domyślnymi Modyfikacja złożonych perspektyw Śledzenie wydarzeń systemowych CREATE [OR REPLACE] TRIGGER nazwa { BEFORE AFTER INSTEAD OF } { INSERT UPDATE DELETE } ON { tabela perspektywa } [ WHEN warunek ] [ ] [ DECLARE /* deklaracje zmiennych i kursorów */ ] /* ciało procedury wyzwalanej */ INSTEAD OF: wyzwalacz może być zdefiniowany tylkona perspektywie WHEN: wyzwalacz wykonuje się tylko dla tych krotek, dla których jest spełniony warunek : wyzwalacz wykonuje się dla każdej modyfikowanej krotki, tzw. wyzwalacz wierszowy 3 4

Definiowanie procedury wyzwalanej DML cd. Klauzula i WHEN Dla procedur wyzwalanych uruchamianych na skutek uaktualnienia krotek, możemy określić listę atrybutów relacji, których uaktualnienie uruchomi procedurę. CREATE OR REPLACE TRIGGER test AFTER UPDATE OF placa_pod, id_zesp ON pracownicy... Ta sama procedura może być wrażliwa na kombinację instrukcji DML (tj. INSERT, UPDATE, DELETE). (niezgodne ze standardem) CREATE OR REPLACE TRIGGER test AFTER INSERT OR UPDATE OR DELETE ON pracownicy IF INSERTING THEN... ELSIF UPDATING THEN... ELSIF DELETING THEN... CREATE OR REPLACE TRIGGER test BEFORE UPDATE ON pracownicy WHEN (OLD.placa_dod < 100) IF (:NEW.placa_pod <= 100) THEN... IF (:NEW.etat!= :OLD.etat) THEN... w klauzuli WHEN i ciele wyzwalacza można uzyskać dostęp do starej i nowej wartości atrybutu domyślnie stara i nowa wersja rekordu są dostępne przez pseudorekordyold i NEW (w ciele wyzwalacza poprzedzane dwukropkiem), ich nazwy można 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 5 6 Przykład procedury wyzwalanej DML (1) Przykład procedury wyzwalanej DML (2) 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_prac BEFORE INSERT ON pracownicy IF (:NEW.id_prac IS NULL) THEN :NEW.id_prac:= seq_pracownik.nextval; Poniższa procedura sprawdza, czy płaca przyznana asystentowi nie przekracza widełek płacowych dla asystenta. CREATE OR REPLACE TRIGGER trig_placa_asystenta BEFORE UPDATE OF placa_pod ON pracownicy WHEN (NEW.ETAT = 'ASYSTENT') DECLARE v_max NUMBER; v_min NUMBER; SELECT placa_min, placa_max INTO v_min, v_max FROM etaty WHERE nazwa = 'ASYSTENT'; IF :NEW.placa_pod NOT BETWEEN v_min AND v_max THEN RAISE_APPLICATION_ERROR(-20001,'Za wysoka placa'); 7 8

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 (ograniczenie to nie dotyczy wyzwalaczy INSTEAD OF) CREATE TRIGGER PoliczPracownikow AFTER DELETE ON pracownicy DECLARE v_ilu NUMBER(5); SELECT COUNT(*) INTO v_ilu FROM pracownicy; dbms_output.put_line('liczba pracowników: ' v_ilu); SQL> DELETE pracownicy WHERE nazwisko = 'HAPKE'; ORA-04091: tabela SCOTT.PRACOWNICY ulega mutacji, wyzwalacz/funkcja może tego nie widzieć Określanie porządku uruchamiania wyzwalaczy przypisanych do tego samego zdarzenia W przypadku istnienia wielu wyzwalaczy opartych na tym samym zdarzeniu mogą one być uruchamiane w nieokreślonej kolejności (teoretycznie za każdym razem różnej) Do określenia kolejności uruchamiania wyzwalaczy służy klauzula FOLLOWS wskazująca wyzwalacz poprzedzający CREATE OR REPLACE TRIGGER trig_id_prac BEFORE INSERT ON pracownicy... CREATE OR REPLACE TRIGGER akt_liczbe_prac_w_zesp BEFORE INSERT ON pracownicy FOLLOWS trig_id_prac... 9 10 Wyzwalacze złożone Wyzwalacze złożone przykłady (1) Zazwyczaj wyzwalacz posiada określony poziom (wierszowy lub polecenia) a także jest określonego typu (BEFORE lub AFTER). Ze względu na różne swoje możliwości często wiele wyzwalaczy "współpracuje" ze sobą w celu uzyskania odpowiedniego rezultatu. Taka "współpraca" nie zawsze jest oczywista i wymaga analizy wykonywanych przez wyzwalacze operacji. Zamiast tworzenia wielu wyzwalaczy współpracujących istnieje możliwość skorzystania z tzw. wyzwalaczy złożonych. W wyzwalaczu złożonym osobne sekcje: BEFORE STATEMENT odpowiednik wyzwalacza BEFORE polecenia, AFTER STATEMENT odpowiednik wyzwalacza AFTER polecenia, BEFORE EACH ROW odpowiednik wyzwalacza wierszowego BEFORE, AFTER EACH ROW odpowiednik wyzwalacza wierszowego AFTER. Nie jest konieczne użycie wszystkich sekcji. CREATE OR REPLACE TRIGGER obsluga_wstawiania FOR INSERT ON pracownicy COMPOUND TRIGGER v_licznik NUMBER(10); BEFORE STATEMENT IS DBMS_OUTPUT.PUT_LINE('Przed wstawieniem - raz dla polecenia'); v_licznik:= 0; END BEFORE STATEMENT; BEFORE EACH ROW IS DBMS_OUTPUT.PUT_LINE('Przed wstawieniem - dla rekordu z id_prac = ' :new.id_prac); END BEFORE EACH ROW; AFTER EACH ROW IS DBMS_OUTPUT.PUT_LINE('Po wstawieniu - dla rekordu z id_prac = ' :new.id_prac); v_licznik:= v_licznik + 1; END AFTER EACH ROW; AFTER STATEMENT IS DBMS_OUTPUT.PUT_LINE('Po wstawieniu - raz dla polecenia'); DBMS_OUTPUT.PUT_LINE('Liczba wstawionych rekordów: ' v_licznik); END AFTER STATEMENT; END obsluga_wstawiania; 11 12

Wyzwalacze złożone przykłady (2) ALTER TABLE pracownicy ADD liczba_podwl NUMBER(2); UPDATE pracownicy s SET liczba_podwl = (SELECT COUNT(*) FROM pracownicy WHERE id_szefa = s.id_prac); Wyzwalacze złożone przykłady (3) SELECT * FROM pracownicy WHERE liczba_podwl > 0; CREATE OR REPLACE TRIGGER akt_liczba_podwl FOR INSERT OR DELETE OR UPDATE OF ID_SZEFA ON pracownicy COMPOUND TRIGGER TYPE tab_num IS TABLE OF NUMBER(2) INDEX BY PLS_INTEGER; v_do_akt tab_num; v_id_szefa NUMBER(3); AFTER EACH ROW IS IF (DELETING orupdating) and :OLD.ID_SZEFA isnot nullthen IF v_do_akt.exists(:old.id_szefa) THEN v_do_akt(:old.id_szefa) := v_do_akt(:old.id_szefa) - 1; ELSE v_do_akt(:old.id_szefa) := -1; IF (INSERTING orupdating) and :NEW.ID_SZEFA isnot nullthen IF v_do_akt.exists(:new.id_szefa) THEN v_do_akt(:new.id_szefa) := v_do_akt(:new.id_szefa) + 1; ELSE v_do_akt(:new.id_szefa) := 1; END AFTER EACH ROW; ] ] AFTER STATEMENT IS v_id_szefa:= v_do_akt.first; WHILE (v_id_szefa IS NOT NULL) LOOP DBMS_OUTPUT.PUT_LINE(v_id_szefa ':' v_do_akt(v_id_szefa)); UPDATE pracownicy SET liczba_podwl= liczba_podwl+ v_do_akt(v_id_szefa) WHERE id_prac = v_id_szefa; v_id_szefa:= v_do_akt.next(v_id_szefa); END LOOP; END AFTER STATEMENT; END akt_liczba_podwl; NAZWISKO LICZBA_PODWL --------------- ------------ WEGLARZ 4 BLAZEWICZ 1 SLOWINSKI 1 BRZEZINSKI 5 MORZY 2 update pracownicy SET id_szefa = 100; 14 rows updated. 100:10 110:-1 120:-1 130:-5 140:-2 SELECT * FROM pracownicy WHERE liczba_podwl > 0; NAZWISKO LICZBA_PODWL --------------- ------------ WEGLARZ 14 13 14 Procedura wyzwalana INSTEAD OF Przykład procedury wyzwalanej DDL Pozwala na zapewnianie modyfikowalności złożonych perspektyw. CREATE OR REPLACE VIEW zesp_count AS SELECT nazwa, count(id_prac) AS pracownicy FROM pracownicy RIGHT JOIN zespoly USING (id_zesp) GROUP BY nazwa; CREATE OR REPLACE TRIGGER trig_instead INSTEAD OF INSERT ON zesp_count INSERT INTO zespoly(id_zesp,nazwa,adres) VALUES(seq_zesp.NEXTVAL,:NEW.nazwa,NULL); Procedura wpisuje do tabeli HISTORY datę utworzenia, typ i nazwę każdego obiektu tworzonego wewnątrz schematu użytkownika SCOTT. CREATE TABLE HISTORY ( CR_DATE DATE, CR_OBJECT VARCHAR2(50), CR_NAME VARCHAR2(50)); CREATE OR REPLACE TRIGGER TR_CREATE AFTER CREATE ON scott.schema INSERT INTO HISTORY(CR_DATE,CR_OBJECT,CR_NAME) VALUES (SYSDATE, ORA_DICT_OBJ_TYPE, ORA_DICT_OBJ_NAME); 15 16

Procedury wyzwalane DDL Przykład procedury wyzwalanej zd. systemowym Przykłady zdarzeń DDL ALTER ANALYZE AUDIT CREATE DDL DROP GRANT REVOKE RENAME Przykłady dostępnych atrybutów ORA_CLIENT_IP_ADDRESS ORA_DES_ENCRYPTED_PASSWORD ORA_DICT_OBJ_NAME ORA_DICT_OBJ_OWNER ORA_DICT_OBJ_TYPE ORA_GRANTEE ORA_IS_ALTER_COLUMN ORA_IS_DROP_COLUMN ORA_LOGIN_USER ORA_WITH_GRANT_OPTION Procedura zabrania przyłączać się do bazy danych w weekend. CREATE OR REPLACE TRIGGER TR_WEEKEND AFTER LOGON ON DATABASE IF to_char(sysdate, 'DAY') in('sobota', 'NIEDZIELA') THEN raise_application_error(-20010, 'Logowanie w weekendy zabronione!'); 17 18 Procedury wyzwalane zd. systemowymi Zarządzanie procedurami wyzwalanymi Zdarzenia systemowe mogą być definiowane na poziomie schematu (ON SCHEMA) lub bazy danych (ON DATABASE) Dostępne są następujące zdarzenia systemowe STARTUP (AFTER) SHUTDOWN (BEFORE) LOGON (AFTER) LOGOFF (BEFORE) DB_ROLE_CHANGE SERVERERROR (AFTER) W przypadku wyzwalacza uruchamianego po wystąpieniu (większości) błędów systemowych przydatne mogą być następujące atrybuty ORA_SERVER_ERROR numer błędu ORA_SERVER_ERROR_MSG komunikat o błędzie ORA_SERVER_ERROR_NUM_PARAMS liczba parametrów błędu ORA_SERVER_ERROR_PARAM numer błędu dla wskazanego parametru 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 DISABLE [ENABLE]; Do usunięcie wyzwalacza służy polecenie DROP TRIGGER nazwa; 19 20

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'; 21