Un declansator (trigger) este o procedura care este executata în mod implicit, atunci când asupra tabelului asociat este lansata o comanda
insert, update sau delete.
Declansatorii pot contine instructiuni SQL si PL/SQL care sunt executate ca un întreg si pot invoca alte 545y247f proceduri si alti declansatori. Declansatorul este invocat fie înainte, fie dupa executarea comenzii insert, update sau delete. Creatorul declansatorului specifica momentul în care va fi executat declansatorul în raport cu instructiunile DML.
Declansatorii sunt asociati tabelelor, dar nu si vederilor sau sinonimelor tabelelor. Cu toate acestea, atunci când este executata o instructiune DML asupra unei vederi, sunt executati declansatorii asociati tabelelor de baza ale vederii.
Declansatorii va permit sa executati o procedura rezidenta ori de câte ori este executata o instructiune insert, update sau delete asupra unui tabel predefinit.
Declansatorii sunt deseori folositi pentru a face urmatoarele:
Generarea automata a unor valori care deriva din valorile coloanelor
Impunerea respectarii restrictiilor si privilegiilor
Fac posibila jurnalizarea transparenta a evenimentelor
Strângerea de informatii statistice în legatura cu accesarea tabelelor
Puteti folosi declansatori pentru a suplimenta sistemul intern de auditare al mediului Oracle. Declansatorii va permit sa înregistrati informatii similare celor înregistrate de comanda âudit. De exemplu, puteti folosi declansatori pentru a strânge informatii despre valorile fiecarei linii. Folositi declansatorii în acest mod numai atunci când aveti nevoie de mai multe date decât cele furnizate de facilitatea de auditare a programului.
Declansatorii pot fi folositi pentru întretinerea sincronizata a copiilor tabelelor situate ui diferite noduri ale unei baze de date distribuite. Un exemplu de acest fel în constituie întretinerea instantaneelor. Pentru informatii suplimentare despre instantanee, consultati Capitolul 9, "Instantanee".
Acest capitol trateaza diversele aspecte ale crearii si gestionarii declansatorilor bazei de date. Un declansator este o procedura care este stocata în baza de date si este executata în mod implicit atunci când este modificat un tabel.
Atunci când va pregatiti sa creati un declansator, aveti în vedere urmatoarele:
Folositi un declansator numai atunci când vreti sa efectuati o anumita operatie, ori de câte ori este executata o alta operatie predefinita.
Folositi declansatori pentru operatii globale care trebuie executate pentru declansarea instructiunilor.
Nu folositi declansatori pentru a reproduce o operatie pe care sistemul Oracle o efectueaza deja.
Aveti grija sa nu creati declansatori recursivi.
Pastrati masura atunci când creati declansatorul, astfel încât codul sa fie cât mai mic posibil.
Atunci când o instructiune SQL proceseaza linii ale unui tabel, Oracle nu poate garanta ordinea in care acestea vor fi procesate. Datorita acestui fapt, nu creati declansatori care depind de ordinea liniilor procesate.
Un declansator are trei componente principale:
O instructiune de declansare - Aceasta specifica instructiunile SQL care fac ca Oracle sa activeze declansatorul. Aceste instructiuni de declansare pot fi update, insert si delete. Trebuie sa specificati cel putin una dintre aceste comenzi.
O restrictie de declansare - Aceasta specifica o conditie care trebuie sa fie adevarata pentru ca declansatorul sa fie activat. Aceasta conditie trebuie sa fie o conditie SQL, nu una PL/SQL. Conditia poate sa se gaseasca într-o clauza when.
Actiunea declansatorului - Aceasta specifica blocul PL/SQL pe care programul Oracle îl executa atunci când este activat declansatorul.
Atunci când concepeti si creati declansatorul, specificati de câte ori este executata actiunea declansatorului, în functie de numarul de ori de care este executat declansatorul, exista doua tipuri de declansatori:
Declansator linie - Un declansator linie este executat ori de câte ori tabelul este afectat de instructiunea declansatoare. De exemplu, daca este executata o instructiune update care actualizeaza 30 de linii, declansatorul este executat de 30 de ori. Daca instructiunea update nu afecteaza nici o linie, declansatorul nu este executat.
Declansator instructiune - Un declansator instructiune este executat o singura data pentru instructiunea declansatoare. De exemplu, daca este executata o instructiune update care actualizeaza 30 de linii, declansatorul este executat o singura data. Nu conteaza câte linii sunt afectate de instructiunea declansatoare.
Atunci când definiti un declansator, specificati momentul în care vreti ca declansatorul sa fie activat. Puteti stabili ca actiunea declansatorului sa aiba loc înaintea instructiunii declansatoare sau dupa aceasta instructiune.
Declansatorii before sunt executati înaintea instructiunii declansatoare. Acest tip de declansator este în general folosit pentru urmatoarele:
Pentru a deriva valorile coloanelor înaintea finalizarii instructiunii declansatoare insert sau update.
Pentru a determina daca actiunea declansatorului trebuie executata sau nu.
Acest lucru poate îmbunatati performantele serverului prin eliminarea procesarilor inutile.
Declansatorii after sunt executati dupa executarea instructiunii declansatoare. Acesti declansatori sunt în general folositi pentru urmatoarele:
Atunci când vreti ca instructiunea declansatoare sa fie finalizata înaintea executarii declansatorului
Pentru a executa instructiuni suplimentare fata de actiunile declansatorului before
Pentru a crea un declansator, se foloseste instructiunea create trigger. Sintaxa generala a instructiunii pentru crearea unui declansator este urmatoarea:
create trigger 'comanda declansator'
Iata cuvintele cheie care pot aparea în parametrul trigger command (comanda declansator):
before |
Indica faptul ca declansatorul este executat înaintea instructiunii declansatoare. |
after |
Indica faptul ca declansatorul este executat dupa instructiunea declansatoare. |
delete |
Indica faptul ca declansatorul este executat dupa eliminarea unei linii a tabelului. |
insert |
Indica faptul ca declansatorul este executat ori de câte ori este inserata o linie. |
update |
Indica faptul ca declansatorul este executat ori de câte ori se modifica o valoare în oricare dintre coloanele specificate de clauza of . în cazul în care clauza of lipseste, declansatorul este executat ori de câte este actualizata orice valoare din linie. |
of |
Stabileste coloanele în raport cu care va fi activat declansatorul. |
on |
Defineste schema si numele tabelului pentru care urmeaza sa fie creat declansatorul. |
for each row |
Daca este specificat în instructiunea create trigger, stabileste declansatorul ca declansator linie. In cazul în care clauza lipseste din instructiunea create trigger, 'declansatorul devine un declansator instructiune. |
when |
Defineste restrictia declansatorului. Acest lucra înseamna ca clauza when defineste circumstantele în care este activat declansatorul. |
or replace |
Recreeaza declansatorul daca acesta exista deja. Aceasta va permite sa modificati definitia declansatorului fara sa-1 distrugeti si apoi sa-1 recreati. ' |
Pentru a crea un declansator în schema dumneavoastra, trebuie sa posedati privilegiul de sistem create trigger. Pentru a crea un declansator în schema unui alt utilizator, trebuie sa posedati privilegiul de sistem create any trigger. Numele declansatorului trebuie sa fie unic- relativ la ceilalti declansatori pe care îi posedati.
În exemplul urmator, este creat declansatorul after row (dupa linie) numit elim_articole. Acest declansator este executat dupa eliminarea fiecarei linii care respecta restrictiile definite.'
create trigger elim__articole
after delete on lst_articole
for each row
when (pret_articol < 100)
declare
-- inserati blocul procedurii dumneavoastra aici
end;
Exemplul urmator creeaza un declansator before statement (înainte de instructiune). Remarcati faptul ca drept instructiune declansatoare apar doua comenzi DML.
create trigger articole_snp
before insert and delete" on lst_articole
when (cant_articole > 5000)
declare /* declaratia procedurii */
begin
/* inserati procedura aici */ end;
Conform definitiei anterioare, pentru fiecare tabel pot sa existe urmatoarele 12 tipuri de declansatori. Remarcati faptul ca versiunile anterioare ale.sistemului Oracle nu permiteau existenta a mai mult de un tip de declansator pentru un tabel. Aceasta restrictie nu se aplica în versiunile 7.1 sau mai recente ale sistemului Oracle. Acum puteti crea mai multi declansatori de acelasi tip pentru acelasi tabel. Este însa recomandabil sa creati declansatori multipli de acelasi tip numai spre a fi utilizati pentru instantanee; utilizarea unor asemenea declansatori pentru alte obiecte poate duce la confuzii de programare.
before update row |
before delete row |
Before insert row |
before update statement |
before delete statement |
before insert statement |
after update row |
after delete row |
after insert row |
after update statement |
after delete statement |
after insert statement |
Un declansator trebuie sa fie ori activat ori dezactivat. Atunci când este activat, declansatorul este executat ori de câte ori este executata instructiunea declansatoare si restrictia declansatorului este adevarata.
Daca declansatorul este dezactivat, Oracle nu executa declansatorul atunci când este executata instructiunea declansatoare si conditiile declansatorului sunt satisfacute.
Atunci când este creat, declansatorul este automat activat. Puteti de asemenea sa activati si sa dezactivati declansatorul cu comanda alter table sau alter trigger, urmata de clauza enâble sau disable.
Exemplul urmator dezactiveaza declansatorul t_inventar: alter trigger t_inventar disable;
Pentru a activa si a dezactiva declansatori cu comanda alter trigger, trebuie sa fiti posesorul declansatorului sau al privilegiului de sistem alter any trigger. Pentru a activa si a dezactiva declansatori folosind comanda alter table, trebuie sa fiti posesorul declansatorului sau al privilegiului de sistem
alter any table.
O singura instructiune SQL poate executa pâna la patru declansatori. Acestia sunt declansatorii before row, after row, before statement si after statement. Atunci când sunt declansati acesti declansatori, pot fi testate mai multe constante de integritate, în plus, acesti patru declansatori pot determina declansarea altor declansatori, numiti declansatori în cascada. Pentru a asigura o ordine corecta de declansare, se foloseste urmatorul model de executie:
Se executa declansatorii before statement (înainte de instructiune)
Se parcurg ciclic toate liniile afectate de instructiunea SQL
a. Se executa declansatorii before row (înainte de linie)
b. Se blocheaza si se modifica liniile; se verifica restrictiile de integritate
Se finalizeaza verificarea restrictiilor de integritate amânate
Se executa declansatorii after statement (dupa instructiune)
Acesta este un model generic al secventei corecte a activitatilor declansatorilor. Acest model poate sa prezinte mici variatii sau sa devina recursiv, în functie de declansatorii în cascada si de tipul declansatorilor lansati.
O proprietate importanta a acestui model este aceea ca toate actiunile si verificarile efectuate ca urmare a unei instructiuni SQL trebuie sa se deruleze cu succes. Daca în interiorul unui declansator este generata o exceptie care nu este tratata în mod explicit, declansatorul este oprit si toate modificarile efectuate de el sunt derulate înapoi.
Figura 25.1 ilustreaza o utilizare tipica a unui declansator. Aceasta figura ilustreaza vederea v_articole cu tabelele de baza LST_ARTICOLE si LSTJNVENTAR. Tabelul LSTJNVENTAR are un declansator numit t_efect_inventar.
Figura 25.1. Ilustrarea folosirii unui declansator pentru tinerea evidentei activitatii de inserare. |
|
Atunci când utilizatorul efectueaza o inserare în tabelele de baza prin intermediul vederii v_articole, este lansat un declansator care efectueaza o inserare în tabelul AUDIT_ARTICOLE. în continuare, urmeaza codul corespunzator:
create trigger t_efect_inventar /* defineste numele declansatorului */
after /* defineste instructiunea declansatoare */
insert on lst__inventar /* defineste actiunea declansata */
for each row
begin
insert into audit_articole.nume_articole
values (lst_inventar.nume_articol);
end;
Declansatorii nu pot fi modificati în mod explicit. Trebuie sa înlocuiti declansatorul cu o noua definitie. Atunci când înlocuiti un declansator, trebuie sa includeti clauza Or replace în comanda create trigger. Clauza or replace duce la înlocuirea vechiului declansator cu noul declansator fara afectarea privilegiilor acordate pentru declansatorul initial.
Ca alternativa, declansatorii pot fi distrusi si recreati. Atunci când distrugeti un declansator, sunt de asemenea distruse toate privilegiile asociate declansatorului. Privilegiile trebuie recreate dupa crearea noului declansator.
Comanda drop trigger elimina structura declansatorului din baza de date. Declansatorul trebuie sa fie situat în propria dumneavoastra baza de date; în caz contrar,'trebuie sa posedati privilegiul de sistem drop any trigger.
Comanda urmatoare elimina declansatorul elim_articole din schema dumneavoastra:
drop trigger elim_articole
în cazul declansatorilor, numai codul sursa este pastrat în baza de date. La prima executie, codul sursa al declansatorului este compilat si este pastrat în zona partajata. Daca declansatorul este eliminat din zona partajata, codul sursa trebuie recompilat la urmatoarea utilizare.
Pentru a forta recompilarea unui declansator existent, folositi comanda alter trigger. Atunci când este recompilat, declansatorul poate fi activat sau dezactivat. Comanda alter trigger nu modifica definitia declansatorului existent.
Atunci când este creat un jurnal de instantanee pentru un tabel, programul Oracle creeaza în^mod implicit un declansator af ter row (dupa linie) pentru tabelul respectiv. In consecinta, pentru acest tabel nu poate fi creat un declansator af ter row (dupa linie) definit de utilizator. Acest lucru mai înseamna si ca nu poate fi creat un jurnal de instantanee pentru un tabel care are deja asociat un declansator af ter row (dupa linie).
Daca o comanda update sau delete intra în conflict cu o actualizare concurenta, programul Oracle deruleaza înapoi pâna la un punct de salvare si reia actualizarea. Acest proces poate sa se repete de mai multe ori pâna cârid eliminarea este finalizata cu succes. La fiecare reluare a instructiunii, este lansat declansatorul bef ore statement (înainte de instructiune). Daca într-un declansator se face referire la variabile ale unui pachet, derularea înapoi pâna la punctul de salvare nu anuleaza modificarile aduse acestor variabile.
Sistemul Oracle împiedica declansatorii linie sa citeasca sau sa modifice un tabel care este modificat în momentul respectiv de o instructiune update, insert sau delete. Daca un declansator încearca sa citeasca sau sa modifice un asemenea tabel, este generata o eroare si sunt derulate înapoi toate modificarile efectuate de catre declansator.
De asemenea, sistemul Oracle împiedica declansatorii linie sa modifice coloanele cheii principale, cheii externe sau cheii unice ale tabelului care face obiectul instructiunii declansatorului. La orice asemenea tentativa, Oracle genereaza o eroare, iar modificarile efectuate de catre declansator sunt derulate înapoi.
Pentru a evita aceste restrictii, puteti folosi un tabel temporar, un tabel PL/SQL sau o variabila a unui pachet.
Declansatorii reprezinta unitati ale codului SQL si PL/SQL care sunt executate în mod implicit de catre sistemul Oracle. La rândul lor, declansatorii pot declansa alti declansatori. Declansatorii sunt definiti pentru tabele, dar riu si pentru vederi. Cu toate acestea, orice instructiune insert, update sau delete care are ca obiect o vedere, declanseaza declansatorii tabelelor de baza.
Declansatorii va permit sa executati în mod implicit unitati de cod pentru a deriva automat datele coloanelor, pentru a impune respectarea privilegiilor si a restrictiilor si pentru a genera jurnalizarea transparenta a evenimentelor.
În acest capitol, au fost prezentate metodele prin care utilizatorul poate crea diverse tipuri de declansatori, în definitia declansatorului, definiti instructiunea declansatoare, temporizarea si actiunea declansatorului.
|