Sunteți pe pagina 1din 14

Platform de e-learning i curricul e-content

pentru nvmntul superior tehnic

Proiect nr. 154/323 cod SMIS 4428 cofinanat de prin Fondul European de
Dezvoltare Regional Investiii pentru viitorul dumneavoastr.

Programul Operaional Sectorial Creterea Competitivitii Economice - POS CCE

Platform de e-learning i curricul e-content


pentru nvmntul superior tehnic

Baze de date

26. Triggeri

Introducere
Un trigger este un bloc PL/SQL stocat pe server, care se execut la apariia
unui eveniment care modific starea anumitor obiecte ale bazei de date.
Termenul corespondent n literatura de specialitate romneasc este
declanator, dar este rar folosit i de aceea, n continuare se va folosi
termenul din limba englez.
Tipurile de evenimente care pot determina execuia unui trigger sunt:
comenzi INSERT, UPDATE, DELETE pe o tabel;
comenzi INSERT, UPDATE, DELETE pe un view (cu opiunea INSTEAD OF);

comenzi CREATE, ALTER, DROP la nivel de schem sau baz de date;


comenzi SHUTDOWN, LOGON, LOGOFF la nivel de schem sau baz de date.

Utilitatea i avantajele triggerilor


n general, triggerii se folosesc pentru:
gestionarea restriciilor complexe de integritate;
monitorizarea tranzaciilor;
efectuarea de replicri de tabele situate n diferite noduri ale unei baze de
date distribuite;
pstrarea semnturii userilor care au efectuat operaii pe baza de date;
prelucrarea de informaii statistice n legtur cu accesul tabelelor;
jurnalizarea transparent a evenimentelor.
Printre avantajele utilizrii triggerilor, se pot meniona:
declanarea automat, la apariia evenimentului monitorizat;
lansarea n execuie a unor proceduri stocate specifice;
posibilitatea modificrii n cascad a mai multor obiecte corelate n baza de
date;
transparena fa de utilizator.

Sintaxa de creare a unui trigger


Sintaxa unui trigger este:
CREATE [OR REPLACE] TRIGGER trigger_name
[BEFORE| AFTER| INSTEAD OF]
*INSERT| *OR+ | UPDATE *OF column,+| *OR+ | DELETE+
ON schema_name
[FOR EACH ROW ]
[WHEN condition]
DECLARE
trigger_variables
BEGIN
trigger_body
END;

Cuvinte cheie
unde:
trigger _name este numele triggerului;
schema_name definete userul i tabela/view, pe care se monitorizeaz evenimentul;
column definete coloanele tabelei/view-lui pe care se monitorizeaz evenimentul;
condition reprezint o condiie pentru executarea triggerului, fiind admise corelri dar nu i
interogri;
trigger_variables reprezint seciunea de declarare de variabile locale ale triggerului;
trigger_body reprezint corpul triggerului;
CREATE comanda de creare;
REPLACE - recreaz triggerul, dac acesta exist deja;
BEFORE| AFTER specific momentul executrii triggerului: nainte sau dup apariia
evenimentului;
INSTEAD OF specific c este permis o operaie de inserare, tergere, modificare pe view-uri,
la care nu este permis operaia n mod firesc;

INSERT | UPDATE | DELETE specific evenimentul pe care se declaeaz triggerul;


FOR EACH ROW specific c execuia triggerului se face pentru fiecare linie afectat, cu
respectarea condiiei din clauza WHEN.

Triggeri pe o comand i pe o linie


Exist dou tipuri de triggeri:
triggeri pe o comand sunt executai o singur dat pentru
evenimentul declanator. De exemplu, dac este executat o
comand INSERT de mai multe linii, triggerul este executat o
singur dat. n acest caz, nu este limitare la numrul de linii
afectate de eveniment.

triggeri pe o linie sunt executai ori de cte ori o linie a unei


tabele este afectat de evenimentul declanator. De exemplu,
dac este executat o comanda UPDATE care actualizeaz k linii,
triggerul este executat de k ori.

Triggeri pe evenimente
Triggerul poate fi executat nainte ca evenimentul s aiba loc (opiunea
BEFORE), sau dup ce evenimentul s-a consumat(opiunea AFTER).
n general, triggerii de tip BEFORE sunt folosii pentru :
a salva valorile coloanelor naintea executrii unei comenzi UPDATE;
a decide dac aciunea triggerului trebuie sau nu executat(acest lucru poate
mbunti performanele serverului prin eliminarea procesrilor inutile).
Triggerii de tip AFTER sunt, n general, folosii atunci cnd:
se dorete ca executarea triggerului s se fac dup ce comanda s-a efectuat
cu succes;
nu au aprut erori de procesare, care ar impune o comand ROLLBACK pentru
tranzaciile pariale deja efectuate;
trebuie alterate i alte date corelate cu cele deja afectate.

Triggeri de tip BEFORE


Aceti triggeri se declaneaz la apariia unui eveniment, dar nainte ca
evenimentul s se termine.
Exemplu de trigger de tip BEFORE care afieaz un mesaj ori de cte ori se
face o inserare de date n tabelul angajai:
CREATE OR REPLACE TRIGGER inserare
BEFORE INSERT ON angajati
BEGIN
dbms_output.put_line ('S-a facut o inserare noua in tabelul angajati!');
END;
S verificm cum lucreaz, facnd o inserare n tabel:
SQL> INSERT INTO angajati(id_ang,nume,salariu)
VALUES (999,'PREDA MIHAI', 1500);
SQL> S-a facut o inserare nou n tabelul angajati!
1 row created.

Triggeri de tip AFTER


Sunt triggeri care se declaneaz dup ce evenimentul declanator se
termin. n exemplul urmtor, se creeaz un trigger care afieaz un mesaj,
ori de cte ori s-a fcut o modificare de date n tabela angajai:
CREATE OR REPLACE TRIGGER modificare
AFTER UPDATE ON angajati
BEGIN
dbms_output.put_line('S-a fcut o modificare de date n
tabelul angajati!');
END;
S verificm cum lucreaz triggerul, fcnd o modificare de comision n
tabelul angajai:
SQL> UPDATE angajati SET comision=100 WHERE id_ang=7369;
SQL> S-a fcut o modificare de date n tabelul angajati!
1 row updated.

Predicate condiionale
n cazul n care se execut mai multe comenzi DML, se pot folosi
predicate condiionale n corpul triggerului.
Predicate condiionale sunt:
INSERTING returneaz TRUE, dac triggerul se declaneaz pe
o comand INSERT;
UPDATING returneaz TRUE, dac triggerul se declaneaz pe
o comand UPDATE;
UPDATING (column_name) returneaz TRUE, dac triggerul
se declaneaz pe o comand UPDATE pe o coloan specificat;

DELETING returneaz TRUE, dac triggerul se declaneaz pe o


comand DELETE.

Exemplu:
CREATE OR REPLACE TRIGGER monitor AFTER INSERT OR DELETE OR UPDATE OF salariu,comision
ON angajati FOR EACH ROW
DECLARE
salariu angajati.salariu%TYPE;
comision angajati.comision%TYPE;
BEGIN
IF INSERTING THEN
INSERT INTO mesaje VALUES ('Inserare in tabela angajati',to_char(sysdate,'dd-mm- yyyy
hh:mi:ss'));
ELSIF DELETING THEN

INSERT INTO mesaje VALUES ('Stergere in tabela angajati',to_char(sysdate,'dd-mm- yyyy


hh:mi:ss'));
ELSIF UPDATING ('salariu') THEN INSERT INTO mesaje VALUES ('Salariu modificat in tabela
angajati',:old.salariu ||'/' ||:new.salariu||'/'||to_char(sysdate,'dd-mm-yyyy hh:mi:ss'));
END IF;
END;

Triggere cu opiunea INSTEAD OF


Aceste triggere se definesc numai pe view-uri, nu i pe tabele. Unele view-uri
nu pot fi modificate prin comenzi DML, dar folosind un trigger cu opiunea
INSTEAD OF(in loc de) acest lucru este realizabil. View-urile care nu pot fi
modificate prin comenzile UPDATE, INSERT sau DELETE sunt cele create
printr-o interogare care conine n construcie:
un operator SET sau DISTINCT
o funcie de agregare, sau o funcie analitic

clauzele GROUP BY, ORDER BY, CONNECT BY sau START WITH


o expresie tip colecie ntr-o list SELECT
o subcerere ntr-o list SELECT
unele metode de JOIN

Exemplu:
CREATE OR REPLACE TRIGGER manager INSTEAD OF INSERT ON sefi
REFERENCING NEW AS n
FOR EACH ROW
DECLARE
nr number;
BEGIN
SELECT COUNT(*) INTO nr FROM angajati WHERE id_ang = :n.id_ang;
IF nr = 0 THEN
INSERT INTO angajati (id_ang,nume,id_dep)
VALUES (:n.id_ang, :n.nume, :n.id_dep);
UPDATE angajati SET salariu=:n.salariu, comision=:n.comision,
data_ang=:n.data_ang, id_sef=:n.id_ang WHERE id_ang = :n.id_ang;
END IF;
END;
Trigger created.

S-ar putea să vă placă și