Documente Academic
Documente Profesional
Documente Cultură
Proiect nr. 154/323 cod SMIS 4428 cofinanat de prin Fondul European de
Dezvoltare Regional Investiii pentru viitorul dumneavoastr.
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);
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;
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.
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;
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
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.