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

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

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

Oracle PL/SQL. Paweł Rajba.

1. Wyzwalacze BD (ang. triggers)

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

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

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

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

PODSTAWY BAZ DANYCH 13. PL/SQL

Wyzwalacze TWORZENIE WYZWALACZY

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

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

Zaawansowane bazy danych i hurtownie danych semestr I

Wyzwalacze. Anna Fiedorowicz Bazy danych 2

Cele. Definiowanie wyzwalaczy

BAZY DANYCH W APLIKACJACH SIECIOWYCH

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

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

Plan wykładu BAZY DANYCH II WYKŁAD 2. Bloki. Struktura bloku

Pakiety podprogramów Dynamiczny SQL

Plan wykładu BAZY DANYCH II WYKŁAD 4. Co to jest kursor? Rodzaje kursorów

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

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

DECLARE VARIABLE zmienna1 typ danych; BEGIN

PL/SQL. Zaawansowane tematy PL/SQL

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

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

Przykład 3 Zdefiniuj w bazie danych hurtownia_nazwisko przykładową funkcję użytkownika fn_rok;

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

Administracja i programowanie pod Microsoft SQL Server 2000

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

Bloki anonimowe w PL/SQL

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

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

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

Pakiety są logicznymi zbiorami obiektów takich jak podprogramy, typy, zmienne, kursory, wyjątki.

15. Funkcje i procedury składowane PL/SQL

Bazy danych, 4. wiczenia

Plan wykładu BAZY DANYCH II WYKŁAD 5. Kolekcje. Tablice asocjacyjne Kolekcje Tablice asocjacyjne VARRAY Tablice zagnieżdżone

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

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

Cheatsheet PL/SQL Andrzej Klusiewicz 1/9

INTERNETOWE BAZY DANYCH materiały pomocnicze - wykład X

Procedury i funkcje składowane

Składowane procedury i funkcje

Oracle11g: Programowanie w PL/SQL

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

Hurtownia Świętego Mikołaja projekt bazy danych

PLAN WYKŁADU BAZY DANYCH PODSTAWOWE KWESTIE BEZPIECZEŃSTWA OGRANICZENIA DOSTĘPU DO DANYCH

Oracle10g: Programowanie w PL/SQL

Systemy GIS Tworzenie zapytań w bazach danych

Oracle PL/SQL. Paweł Rajba.

Uprawnienia, role, synonimy

Plan wykładu BAZY DANYCH II WYKŁAD 9. Dynamiczny SQL. Dynamiczny SQL

Język PL/SQL Pakiety podprogramów

I. Język manipulowania danymi - DML (Data Manipulation Language). Polecenia INSERT, UPDATE, DELETE

BAZA DANYCH SIECI HOTELI

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

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

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

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

Oracle PL/SQL. Paweł Rajba.

Bazy danych. Bazy danych. Zapytania SELECT. Dr inż. Paweł Kasprowski.

Technologie baz danych WYKŁAD 7: Wyjątki

Oracle PL/SQL. Paweł Rajba.

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

Wykład V. Indeksy. Struktura indeksu składa się z rekordów o dwóch polach

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

Deklarowanie kursora

Oracle11g: Wprowadzenie do SQL

SQL 4 Structured Query Lenguage

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

Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski.

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

Oracle PL/SQL. Paweł Rajba.

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

Wykład 8. SQL praca z tabelami 5

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

1 Wprowadzenie do bloków nazwanych 1. 2 Parametry 2. 3 Procedury i funkcje 3. 4 Pakiety 6. 5 Podsumowanie Źródła 10

CREATE USER

1 Kursory 1. 2 Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków...

Microsoft SQL Server Podstawy T-SQL

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

BAZY DANYCH Cz III. Transakcje, Triggery

Indeksy. Indeks typu B drzewo

SQL w języku PL/SQL. 2) Instrukcje języka definicji danych DDL DROP, CREATE, ALTER, GRANT, REVOKE

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

Oracle PL/SQL. Paweł Rajba.

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

SQL :: Data Definition Language

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

T-SQL dla każdego / Alison Balter. Gliwice, cop Spis treści. O autorce 11. Dedykacja 12. Podziękowania 12. Wstęp 15

Plan wykładu Projekt fizyczny bazy danych Wprowadzenie PL/SQL PL/SQL Cechy PL/SQL

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

Instrukcje SQL można podzielić na pięć kategorii, które zostały przedstawione w poniższej tabeli.

SQL Server i T-SQL w mgnieniu oka : opanuj język zapytań w 10 minut dziennie / Ben Forta. Gliwice, Spis treści

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

Aspekty aktywne baz danych

Transkrypt:

Plan wykładu BAZY DANYCH II WYKŁAD 8 Wyzwalacze: zalety, rodzaje, tworzenie, Wyzwalacze DML, Wyzwalacze zastępujące, Wyzwalacze systemowe, Tabele mutujące, Wyzwalacze złożone, Wyzwalacze a SQL Developer, dr inż. Agnieszka Bołtuć Wyzwalacze Wyzwalacze Są to nazwane bloki języka PL/SQL, Posiadają sekcje deklaracji, wykonawczą i obsługi wyjątków, Są przechowywane w bazie jako odrębne obiekty, Są jednak uruchamiane niejawnie w momencie gdy nastąpi wyzwalające zdarzenie, Nie posiadają argumentów. Wyzwalacze mogą być zdefiniowane na tabelach, widokach, schematach lub bazach danych, Zdarzeniem wyzwalającym może być operacja DML (DELETE, INSERT, UPDATE), zdarzenie systemowe (otwarcie lub zamknięcie bazy danych, wystąpienie błędu, logowanie lub wylogowanie użytkownika) lub określone operacje DDL (CREATE, ALTER, DROP), 1

Zalety używania wyzwalaczy Typy wyzwalaczy Zachowywanie złożonych ograniczeń integralnościowych, których nie można zapewnić za pomocą ograniczeń tworzonych podczas definicji tabeli, Kontrola informacji z tabel, rejestracja zmian i ich autorów, W razie wprowadzania zmian w tabeli automatyczne powiadamianie innych programów o konieczności wykonania niezbędnych operacji, Bezpieczne użytkownicy i aplikacje nie mogą ich ominąć, DML uruchamiane w wyniku wykonania instrukcji INSERT, UPDATE, DELETE, można je uruchamiać przed lub po operacji, mogą działać dla wybranych wierszy lub dla wszystkich, Zastępujące definiowane są jedynie dla widoków, są uruchamiane zamiast wywołujących je instrukcji DML, działają na poziome wierszy, Systemowe jest uruchamiany, gdy zajdzie zdarzenie systemowe lub operacja DDL. Tworzenie wyzwalaczy CREATE [OR REPLACE] TRIGGER nazwa {BEFORE AFTER INSTEAD OF} Zdarzenie ON obiekt [REFERENCING [OLD AS nazwa NEW AS nazwa]] [FOR EACH ROW] [WHEN warunek] [DECLARE] Ciało; [EXCEPTION ] Tworzenie wyzwalaczy Nazwa nazwa identyfikująca wyzwalacz, Zdarzenie zdarzenie, które uruchamia wyzwalacz, najczęściej na konkretnym obiekcie INSERT DELETE UPDATE UPDATE OF kolumny REFERENCING nadawanie innych nazw identyfikatorom korelacji, tylko wyzwalacze z poziomu wierszy, FOR EACH ROW określenie wyzwalacza z poziomu wierszy, WHEN warunek ciało wyzwalacza uruchamiane jest tylko wtedy, gdy podany warunek ma wartość TRUE, jest sprawdzane na samym początku, tylko wyzwalacze z poziomu wierszy, 2

Tworzenie wyzwalaczy Tworzenie wyzwalaczy DML Ciało wyzwalacza składa się z opcjonalnej sekcji deklaracji, wówczas rozpoczyna się ona słowem DECLARE, Sekcja wyjątków jest opcjonalna, Ciało wyzwalacza nie może być większe niż 32 KB, ze względu na to że jest często wywoływane musi być krótkie. Uruchamiane są dla instrukcji INSERT, UPDATE, DELETE, przed ich wykonaniem lub po, jeden raz dla każdego zmodyfikowanego wiersza lub instrukcji, W związku z różnymi trybami istnieje 28 typów wyzwalaczy DML 7 instrukcji wraz z kombinacjami * 2 momenty wykonania * 2 poziomy wykonania. Rodzaje wyzwalaczy DML Kategoria Instrukcja Wartości INSERT, UPDATE, DELETE Pojedyncze instrukcje powodujące uruchamianie wyzwalacza lub ich kombinacje Moment wykonania BEFORE, AFTER Wyzwalacz jest uruchamiany przed lub po wykonaniu instrukcji, Poziom wykonania Wiersze lub instrukcje Wyzwalacz działający dla wierszy uruchamia się raz dla każdego z nich użytego przez instrukcję ( za jego utworzenie odpowiada klauzula FOR EACH ROW), wyzwalacze z poziomu instrukcji są uruchamiane jeden raz przed lub po jego wykonaniu, Kolejność uruchamiania wyzwalaczy DML Wyzwalacze z poziomu instrukcji BEFORE, Dla każdego wiersza, którego dotyczy instrukcja: BEFORE z poziomu wiersza, Polecenie, AFTER z poziomu wiersza, Wyzwalacze z poziomu instrukcji typu AFTER. 3

Wyzwalacz z poziomu instrukcji - przykład CREATE OR REPLACE TRIGGER test BEFORE INSERT ON employees IF (TO_CHAR(SYSDATE, DY ) IN ( SO, N )) THEN RAISE_APPLICATION_ERROR(-20500, Nie wstawiaj do tabeli w weekend ); END IF; Wyzwalacz z poziomu wierszy - przykład CREATE OR REPLACE TRIGGER test BEFORE INSERT OR UPDATE ON employees FOR EACH ROW :new.job_id:=upper(:new.job_id); Identyfikatory :old i :new W wyzwalaczu z poziomu wiersza można uzyskać dostęp do danych tego wiersza, W tym celu używamy dwóch identyfikatorów korelacji :old i :new, które są specjalnymi zmiennymi powiązanymi, Są one traktowane jako rekord tabeli z którą powiązany jest wyzwalacz, Są one nazywane pseudorekordami, bo są one rekordami tylko w składni, nie można przypisywać ich jako całych rekordów. Identyfikatory :old i :new Instrukcja Stara wartość Nowa wartość INSERT NULL Wstawiane wartości UPDATE DELETE Wartości sprzed aktualizacji Wartości sprzed usuwania Odwołania do pól pseudorekordu :new.pole Wartości po aktualizacji NULL w Oracle mamy jeszcze dodatkowy identyfikator :parent związany z tabelami zagnieżdżonymi. 4

Identyfikatory - przykład Klauzula REFERENCING CREATE OR REPLACE TRIGGER Id BEFORE INSERT ON employees FOR EACH ROW SELECT employees_seq.nextval INTO :new.employee_id FROM employees; Służy do określenia innej nazwy identyfikatorów :old i :new, Po zdarzeniu wyzwalającym należy użyć składni: REFERENCING [OLD AS nazwa] [NEW AS nazwa] Wówczas w ciele wyzwalacza można używać nowych nazw dla pól pseudorekordu, Klauzula WHEN WHEN - przykład Używany dla wyzwalacza z poziomu wierszy, Ciało zostanie wykonane tylko dla wierszy, które spełniają warunek, Składnia: WHEN warunek; Warunek to wyrażenie logiczne, można w nim używać identyfikatorów :new i :old, bez dwukropka, CREATE OR REPLACE TRIGGER Id BEFORE INSERT OR UPDATE OF salary ON employees FOR EACH ROW WHEN (new.salary >20000) RAISE_APPLICATION_ERROR(-20202, Pracownik nie może zarabiać więcej niż 20000 ); 5

Predykaty wyzwalaczy Predykaty - przykład Dla wyzwalaczy w których używane są więcej niż jedna instrukcja DML można używać dodatkowych funkcji logicznych: INSERTING, DELETING, UPDATING, Każda z nich zwraca TRUE jeśli instrukcja wyzwalająca to ta która jest z nim powiązania, w przeciwnym przypadku zwraca FALSE, CREATE OR REPLACE TRIGGER pred BEFORE INSERT OR DELETE OR UPDATE ON employees IF (TO_CHAR(SYSDATE, DY ) IN ( SO, N )) THEN IF INSERTING THEN RAISE_APPLICATION_ERROR(-20500, Nie wstawiaj do tabeli w weekend ); END IF; IF DELETING THEN RAISE_APPLICATION_ERROR(-20500, Nie usuwaj z tabeli w weekend ); END IF; IF UPDATING THEN RAISE_APPLICATION_ERROR(-20500, Nie modyfikuj tabeli w weekend ); END IF; END IF; Status wyzwalacza Status wyzwalacza Od wersji Oracle 11g wyzwalacz może być w dwóch stanach: aktywny i nieaktywny, Wcześniej błąd w ciele wyzwalacza powodował niepowodzenie w wykonaniu instrukcji DML na tabeli, Można ustalić stan wyzwalacza na nieaktywny i przełączyć go tylko wtedy, gdy mamy pewność że wyzwalacz wykona się prawidłowo, Można także tymczasowo anulować aktywność wyzwalacza w przypadku gdy obiekt do którego się odnosi jest niedostępny, jeśli chcemy przetworzyć dużą porcję danych i nie chcemy tego poprzedzać działaniem wyzwalacza lub przetworzyć dane ponownie, Aby utworzyć nieaktywny wyzwalacz należy dodać w jego definicji przed słowem kluczowym słowo DISABLE, 6

Status wyzwalacza Zmiana statusu wyzwalacza ALTER TRIGGER nazwa ENABLE DISABLE; Zmiana statusu wyzwalaczy dla danej tabeli ALTER TABLE nazwa DISABLE ENABLE ALL TRIGGERS; Ponowna kompilacja wyzwalacza ALTER TRIGGER nazwa COMPILE; Usunięcie wyzwalacza DROP TRIGGER nazwa; Polecenia związane z wyzwalaczami User_triggers dane na temat wyzwalaczy: nazwa, tabela powiązana, czas kompilacji, itd., atrybuty dostępne po wywołaniu polecenia DESCRIBE user_triggers; SELECT trigger_name, trigger_body FROM user_triggers; User_errors informacje na temat błędów które nastąpiły w czasie kompilacji wyzwalacza, Wyzwalacz zastępujący Wyzwalacz zastępujący - przykład Wyzwalacza typu INSTEAD OF, Używany zamiast instrukcji DML i tylko dla widoków, Używamy w dwóch przypadkach: W celu dokonywania zmian w widoku, którego nie możemy w inny sposób modyfikować, W celu modyfikowania kolumn tabeli zagnieżdżonej w widoku, Wyzwalacze te działają na poziomie wierszy, CREATE OR REPLACE VIEW dzial AS SELECT department_name, COUNT(*) FROM employees NATURAL JOIN departments GROUP BY department_name; widok CREATE OR REPLACE TRIGGER widok INSTEAD OF INSERT ON dzial FOR EACH ROW INSERT INTO departments (department_id, department_name) VALUES (dzialyseq.nextval, :new.department_name); 7

Wyzwalacze systemowe Wywoływane dla zdarzeń DDL (CREATE, ALTER, DROP) oraz zdarzeń bazy danych (uruchomienie i zamknięcie serwera, logowanie i wylogowanie użytkownika, błędy serwera), Tworzenie wyzwalaczy systemowych CREATE [OR REPLACE] TRIGGER {BEFORE AFTER} {zdarzenia_ddl zdarzenia_bazy_danych} ON {DATABASE [schemat.]schema} [WHEN warunek] [DECLARE] Ciało; [EXCEPTION ] Tworzenie wyzwalaczy systemowych Wyzwalacze systemowe są powiązane jedynie z czasem wyzwalania BEFORE lub AFTER, Można je definiować z poziomu bazy danych lub schematu, te zdefiniowane z poziomu bazy są wykonywane przy każdym wystąpieniu zdarzenia, zaś te z poziomu schematu tylko wtedy gdy zdarzenie wystąpi w konkretnym schemacie, Domyślnie jest przyjmowany schemat do którego należy dany wyzwalacz, Zdarzenia DDL i bazy danych STARTUP AFTER wykonywane przy uruchamianiu egzemplarza bazy, SHUTDOWN BEFORE przy zamykaniu, z wyjątkiem nietypowego zamknięcia, SERVERERROR AFTER przy każdym wystąpieniu błędu, LOGON AFTER po zalogowaniu użytkownika, LOGOFF BEFORE przy wylogowywaniu użytkownika, 8

Zdarzenia DDL i bazy danych CREATE, DROP, ALTER, RENAME, DDL AFTER, BEFORE po lub przed utworzeniem, usunięciem, modyfikacją, zmianą nazwy obiektu schematu i po lub przed zgłoszeniem większości instrukcji DDL, Wyzwalacz systemowy - przykład CREATE OR REPLACE TRIGGER logow AFTER LOGON ON SCHEMA INSERT INTO logowania (user_id, log_date, dzialanie) VALUES (USER, SYSDATE, Logowanie ); Funkcje-atrybuty zdarzeń Pozwalają na pobieranie w ciele wyzwalacza informacji o zdarzeniu wyzwalającym. ORA_DICT_OBJ_TYPE zwraca VARCHAR2(20), związane z ALTER, CREATE, DDL, DROP, GRANT, RENAME, zwraca typ obiektu słownika dla którego zaszła operacja DDL ORA_IS_CREATING_NESTED_TABLE zwraca BOOLEAN, związane z CREATE, zwraca true jeśli zdarzenie tworzy tabelę zagnieżdżoną, ORA_IS_DROP_COLUMN (nazwa kolumny IN VARCHAR2) zwraca BOOLEAN, związane z DROP, zwraca true jeśli kolumna została usunięta, Funkcje-atrybuty zdarzeń ORA_IS_ALTER_COLUMN (nazwa kolumny IN VARCHAR2) zwraca BOOLEAN, związane z ALTER, zwraca true jeśli kolumna została zmodyfikowana przez zdarzenie, ORA_LOGIN_USER Zwraca VARCHAR2(20), związane ze wszystkimi zdarzeniami, zwraca nazwę zalogowanego użytkownika, ORA_SYSEVENT Zwraca VARCHAR2, związane ze wszystkimi zdarzeniami, zwraca nazwę zdarzenia systemowego uruchamiającego dany wyzwalacz, 9

Klauzula WHEN a wyzwalacze systemowe W wyzwalaczach systemowych można używać klauzuli WHEN uwzględniając pewne ograniczenia warunku: STARTUP i SHUTDOWN nie mogą mieć żadnych warunków, W SERVERERROR można sprawdzać wartość ERRNO, by uruchamiać wyzwalacze przy wystąpieniu określonych błędów, W LOGON i LOGOFF można sprawdzać nazwę i identyfikator użytkownika, Wyzwalacze DDL mogą sprawdzać typ i nazwę modyfikowanego obiektu oraz identyfikator i nazwę użytkownika. Wyzwalacze - informacje Przestrzeń nazw wyzwalaczy jest inna niż pozostałych podprogramów, Wyzwalacz (ani jego funkcje czy procedury) nie może wywoływać instrukcji kontrolnych (COMMIT, SAVEPOINT, etc.), nie można w nim także deklarować zmiennych typu LONG i LONG RAW, Ciało wyzwalacza nie może modyfikować wartości kolumn typu LOB, CALL w wyzwalaczach CALL w wyzwalaczach Od wersji Oracle 8i ciałem wyzwalacza może być instrukcja CALL, Wywołujemy procedurę, która jest napisana w PL/SQL, C lub Javie, Kod wywołania (brak średnika na końcu): CALL nazwa_procedury Jako parametry procedury można używać identyfikatory :new i :old, CREATE OR REPLACE TRIGGER pensja BEFORE UPDATE ON employees FOR EACH ROW CALL sprawdz_pensje(:new.salary) / 10

Wyzwalacze a uprawnienia Tabele mutujące CREATE TRIGGER pozwala na tworzenie wyzwalacza w swoim schemacie, CREATE ANY TRIGGER j.w., we wszystkich schematach, oprócz SYS, ALTER ANY TRIGGER pozwala włączać, wyłączać oraz kompilować wyzwalacze w dowolnym schemacie, DROP ANY TRIGGER pozwala na usuwanie wyzwalaczy z dowolnego schematu, ADMINISTER DATABASE TRIGGER pozwala na tworzenie i modyfikację wyzwalaczy systemowych bazy danych, Tabela mutująca tabela aktualnie modyfikowana przez instrukcje DML oraz tabela wymagająca aktualizacji ze względu na ograniczenia integralnościowe (DELETE CASCADE), Tabela ograniczająca należy ja wczytać ze względu na ograniczenie spójności odwołań, Tabele mutujące Instrukcje SQL w ciele wyzwalacza nie mogą: Pobierać i modyfikować danych z tabel mutujących, które są używane w instrukcjach wyzwalacza, także z samej tabeli wyzwalającej, Pobierać danych z kolumn z kluczem głównym, unikalnym ani zewnętrznym tabel ograniczających tabeli wyzwalającej, pozostałe kolumny można modyfikować, Odnosi się to do wyzwalaczy z poziomu wierszy, do wyzwalaczy z poziomu instrukcji tylko wtedy gdy wyzwalacz jest uruchomiony w wyniki instrukcji DELETE CASCADE, Tabele mutujące - przykład CREATE OR REPLACE TRIGGER pensja BEFORE INSERT OR UPDATE ON employees FOR EACH ROW DECLARE v_max employees.salary%type; BŁAD SELECT MAX(salary) INTO v_max ORA-4091, table is mutating FROM employees WHERE department_id=:new.department_id; IF :new.salary>v_max THEN RAISE_APPLICATION_ERROR( ); END IF; 11

Tabele mutujące - rozwiązanie Należy utworzyć dwa wyzwalacze z poziomu wierszy i poziomu instrukcji, W pierwszym można używać potrzebnych identyfikatorów korelacji (:new, :old), zaś w drugim można kierować zapytania do tabeli wyzwalającej, Należy jednak przekazać wartość identyfikatora z jednego wyzwalacza do drugiego, Tabele mutujące - rozwiązanie Jedno z rozwiązań polega na utworzeniu pakietu wraz z tabelą lub tabelami PL/SQL, W pakiecie zmienne, kolekcje są globalne, W tabelach można zapisać wiele wartości, Wartości są widziane w obu wyzwalaczach, które są zawarte w pakiecie jako jego podprogramy, Wyzwalacze złożone Pojawiły się w wersji Oracle 11g, Pozwalają na utworzenie jednego wyzwalacza dla czerech różnych momentów i poziomów wykonania, Mają sekcję deklaracji oraz sekcje dla każdego z czterech momentów i poziomów wykonania, Są rozwiązaniem problemu tabel mutujących, dużo bardziej wydajnym niż wykorzystywanie pakietów i tabel PL/SQL, Wyzwalacze złożone - sekcje Sekcje wyzwalacza złożonego to (w odpowiedniej kolejności): BEFORE STATEMENT AFTER STATEMENT BEFORE EACH ROW AFTER EACH ROW 12

Wyzwalacze złożone - schemat CREATE OR REPLACE TRIGGER nazwa FOR zdarzenie ON tabela COMPOUND TRIGGER sekcja deklaracji, podprogramów BEFORE STATEMENT IS ; AFTER STATEMENT IS ; BEFORE EACH ROW IS ; AFTER EACH ROW IS ; Ograniczenia wyzwalaczy złożonych Dotyczą wyzwalaczy DML na tabelach lub widokach, Ciało wyzwalacza to blok PL/SQL, Ciało nie ma sekcji wyjątków, Identyfikatorów korelacji nie można używać w części deklaracyjnej i sekcjach AFTER i BEFORE STATEMENT, FOLLOWS Tworzenie wyzwalaczy w SQL Developer Nowość w Oracle 11g, Pozwala na ustalenie kolejności wykonywania wyzwalaczy, Składnia: CREATE OR REPLACE TRIGGER nazwa BEFORE INSERT ON tabela FOR EACH ROW FOLLOWS nazwa1 wówczas wyzwalacz nazwa zostanie poprzedzony przez nazwa1 Okno programu SQL Developer 13

Obsługa wyzwalaczy w SQL Developer WYKORZYSTANA LITERATURA J. Price, Oracle Database 11g i SQL. Programowanie. Helion, 2009. S. Urman, R. Hardman, M. McLaughlin, Oracle Database 10g. Programowanie w języku PL/SQL. Helion, 2008. www.oracle.com Okno programu SQL Developer 14