Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Declansatori

Oracle


Declansatori

Ce este un declansator?

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.

De ce se folosesc declansatorii?

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".

Cum se utilizeaza declansatorii

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.

Sfaturi în legatura cu folosirea declansatorilor

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.

Componentele unui declansator

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.

Tipuri de declansatori

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.

Temporizarea declansatorilor

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

Crearea unui declansator

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 re­creati. '

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

Activarea si dezactivarea declansatorilor

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.

Executarea declansatorilor

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;

Modificarea declansatorilor

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.

Distrugerea unui 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

Recompilarea unui declansator

î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.

Declansatorul jurnalului de instantanee

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).

Referirea la variabilele pachetelor

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.

Protejarea tabelelor

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.

Rezumat

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.


Document Info


Accesari: 3445
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )