PL/SQL

12
PL/SQL(5) M. Rakowski - WSISiZ 1 PL/SQL Zajęcia nr V

description

PL/SQL. Zajęcia nr V. Wyzwalacze. Zdarzeniowo (podczas zajścia operacji na bazie danych) uruchamiane nazwane bloki PL/SQL, związane z tabelą, widokiem, schematem lub bazą danych. Wyzwalacze. Automatycznie uruchamiane w trakcie takich zdarzeń jak: - PowerPoint PPT Presentation

Transcript of PL/SQL

Page 1: PL/SQL

PL/SQL(5) M. Rakowski - WSISiZ 1

PL/SQL

Zajęcia nr V

Page 2: PL/SQL

PL/SQL(5) M. Rakowski - WSISiZ 2

Wyzwalacze

Zdarzeniowo (podczas zajścia operacji na bazie danych) uruchamiane nazwane bloki PL/SQL, związane z tabelą, widokiem, schematem lub bazą danych.

Page 3: PL/SQL

PL/SQL(5) M. Rakowski - WSISiZ 3

Wyzwalacze

Automatycznie uruchamiane w trakcie takich zdarzeń jak:• każdego wiersza związanego z instrukcja DML (z

wykorzystaniem FOR EACH ROW) • użycia instrukcji DML (INSERT, DELETE, UPDATE)• użycia instrukcji DDL (CREATE, DROP, ALTER)• zdarzenia bazodanowego (SERVERERROR(AFTER),

LOGON(AFTER), LOGOFF(BEFORE), STARTUP(AFTER)(DATABASE), SHUTDOWN(BEFORE) (DATABASE))

Page 4: PL/SQL

PL/SQL(5) M. Rakowski - WSISiZ 4

Składnia wyzwalaczy

* - może być kilka rozdzielonych słowem ‘OR’ • INSERT, DELETE -- wyzwalacz dla instrukcji odp. INSERT lub DELETE• UPDATE [OF kol,...] -- wyzwalacz dla instrukcji UPDATE (modyfikującej

kolumnę)• Klauzula INSTEAD OF – jest związana z implementacją wyzwalacza na

widoku, który może być oparty o złączenia tabel i wówczas zamiast próby operacji na widoku (co się nie powiedzie) wykonywany jest kod wyzwalacza

• Klauzula WHEN z warunkiem (występującą z FOR EACH ROW) powoduje uruchomienie wyzwalacza dla wiersza jeśli jest spełniony warunek.

• Przed deklaracją zmiennych bloku występuje DECLARE a nie występuje IS

CREATE [OR REPLACE] TRIGGER nazwa_trg [BEFORE|AFTER] [INSTEAD OF] [rodzaj instrukcji]* ON [tabela|widok|DATABASE|SCHEMA]! [FOR EACH ROW ] [WHEN ( warunek logiczny )] blok PL/SQL

Page 5: PL/SQL

PL/SQL(5) M. Rakowski - WSISiZ 5

Wyzwalacze – zmienne wiersza

W wyzwalaczu wierszowym można odwoływać się do starych i nowych wartości w wierszu:

• :OLD.kolumna - kolumna przed zmiana • :NEW.kolumna - kolumna po zmianie

(w warunku WHEN nie występują dwukropki)w wyzwalaczu dla INSERT nie występują zmienne OLDw wyzwalaczu dla DELETE nie występują zmienne NEW

Page 6: PL/SQL

PL/SQL(5) M. Rakowski - WSISiZ 6

Wyzwalacze - stosowanie

Specjalne zmienne systemowe typu BOOLEAN informują o typie operacji:

• INSERTING - wyzwalacz uruchomiony dla INSERT • DELETING - wyzwalacz uruchomiony dla DELETE • UPDATING - wyzwalacz uruchomiony dla UPDATE

Page 7: PL/SQL

PL/SQL(5) M. Rakowski - WSISiZ 7

Wyzwalacze – włączanie/wyłączanie

Operacja na wyzwalaczach: • ALTER TRIGGER nazwa_trg [ENABLE|DISABLE]!;

- włącz / wyłącz wyzwalacz• DROP TRIGGER nazwa_trg; - usuń• ALTER TRIGGER nazwa_trg COMPILE; - kompiluj

kod wyzwalacza

Dane o wyzwalaczach użytkownika są przechowywane w perspektywie USER_TRIGGERS.

Page 8: PL/SQL

PL/SQL(5) M. Rakowski - WSISiZ 8

Wyzwalacze - przykłady

Automatyczne nadanie wartości dla kolumny klucza głównego

Zadanie 1: przetestować

CREATE OR REPLACE TRIGGER new_dept_rl_iBEFORE INSERT ON NEW_DEPTFOR EACH ROWBEGIN

SELECT NVL(MAX(deptno),0)+10INTO :NEW.deptnoFROM NEW_DEPT;

END;

Page 9: PL/SQL

PL/SQL(5) M. Rakowski - WSISiZ 9

Wyzwalacze - przykłady

Zadanie 2: przetestować

CREATE OR REPLACE TRIGGER new_dept_uBEFORE UPDATE OF loc ON NEW_DEPTBEGINDBMS_OUTPUT.PUT_LINE( 'lokalizacja zmieniona' );END;

CREATE OR REPLACE TRIGGER new_dept_rl_uBEFORE UPDATE OF loc ON NEW_DEPTFOR EACH ROWBEGIN DBMS_OUTPUT.PUT_LINE( 'lokalizacja zmieniona z ' || :OLD.loc

|| ' na ' ||:NEW.loc );

END new_dept_rl_u;

Page 10: PL/SQL

PL/SQL(5) M. Rakowski - WSISiZ 10

Wyzwalacze - przykładyCREATE OR REPLACE TRIGGER new_dept_iuBEFORE UPDATE OR INSERT ON NEW_DEPTBEGIN

IF INSERTING THEN DBMS_OUTPUT.PUT_LINE( 'Wykonano insert'); ELSE DBMS_OUTPUT.PUT_LINE( 'Wykonano update');END IF;

END;

CREATE OR REPLACE TRIGGER new_dept_rl_iuBEFORE UPDATE OR INSERT ON NEW_DEPTFOR EACH ROWBEGIN

IF INSERTING THEN DBMS_OUTPUT.PUT_LINE( 'Wykonano insert wiersza'); ELSE DBMS_OUTPUT.PUT_LINE( 'Wykonano update wiersza');END IF;

END;

Zadanie 3: przetestować

Page 11: PL/SQL

PL/SQL(5) M. Rakowski - WSISiZ 11

Wyzwalacze - przykłady

Zadanie 4: 1. Osadzić2. Dokonać usunięcia rekordu z zadania 13. Zmienić dzień w IF oraz w opisie błędu na ‘WTOREK’4. Dokonać próby usunięcia dowolnego rekordu z NEW_DEPT

CREATE OR REPLACE TRIGGER new_dept_dBEFORE DELETE ON NEW_DEPTBEGIN

IF RTRIM(TO_CHAR(SYSDATE, 'DAY') )= 'SOBOTA' THEN DBMS_OUTPUT.PUT_LINE( 'ZMIANA W SOBOTĘ' );ELSE

RAISE_APPLICATION_ERROR( -20111 , 'Można kasować tylko w sobotę');

END IF;END;

Page 12: PL/SQL

PL/SQL(5) M. Rakowski - WSISiZ 12

Zadanie

Wykonać auditing usuwania dla tabeli new_deptOprócz usuwanych danych rejestrować nazwę

użytkownika (user) i czas (sysdate)Tabela audytu niech ma nazwę new_dept_audDodatowe, opisane wyżej kolumny, to

data_czas_operacji i uzytkownikDokonać kolejno operacji usunięcia wierszy –

sprawdzić działanie audytu