Documente Academic
Documente Profesional
Documente Cultură
Corp_trigger poate fi un bloc PL/SQL (Begin…End) sau un apel de procedura. Procedura poate fi
implementata in PL/SQL, C sau JAVA, iar apelul se realizeaza: CALL nume_proc (fara ; dupa
numele sau!!!)
Exemplu:
--Se creează un trigger care se declanşează înaintea fiecărei operaţii de inserare în tabela
PRODUSE.
-1-
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle – seminarul 10
BEGIN
dbms_output.put_line('triggerul s-a executat');
END;
/
Exemplu:
Triggerul se declanşează la operaţiile de INSERT, DELETE sau UPDATE pe tabela Produse.
In tabela TEMP_LOG se introduce tipul operaţiei, utilizatorul care a executat-o, data
curentă.
END;
/
--inserarea in tabela
insert into produse values (300, 'cafea', 'buc', 60);
--stergere
delete from produse where stoc>=300;
-2-
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle – seminarul 10
Exemple:
--Se creează un trigger pentru a nu se permite depăşirea stocului maxim ce poate fi depozitat
CREATE OR REPLACE TRIGGER restrict_stoc
BEFORE INSERT or UPDATE on produse
FOR EACH ROW
WHEN (old.um='buc')
BEGIN
IF :new.stoc>9000 then
RAISE_APPLICATION_ERROR (-20202, 'Pentru un produs nu se poate depasi stocul
de 9000');
end if;
END;
/
update produse
set stoc =9500
where codprodus=222;
--Se creează un trigger care asigură unicitatea codului produsului folosind valorile generate de o
secvenţă
CREATE SEQUENCE produse_secv
START WITH 1
INCREMENT BY 1
MAXVALUE 100
NOCYCLE;
-3-
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle – seminarul 10
Clauza INSTEAD OF
Sunt triggeri realizati doar pentru view-uri
Se utilizeaza pentru actualizarea tabelelor din care este construit un view neactualizabil.
Realizeaza operatii DML pe aceste tabele, iar Oracle Server declanseaza triggerii pe tabelele
respective.
Daca un view este actualizabil, triggerii respectivi se declanseaza automat.
Sunt triggeri la nivel de rand.
Nu permit utilizarea clauzelor BEFORE|AFTER
--crearea triggerului
create or replace trigger exemplu_trigger
instead of insert or update or delete on clienti
for each row
begin
if inserting then
insert into firme values (:new.codfirma, :new.denfirma, :new.loc, null, null);
insert into agenti (codagent, numeagent) values (:new.codagent, :new.numeagent);
insert into comenzi values (:new.nrcom, :new.codfirma, :new.codagent, :new.data);
end if;
end;
/
show errors;
--testare trigger
insert into clienti values (11,'zuzu','Bucuresti',82,'12-APR-04',3,'ionescu');
update clienti
set denfirma='cucu'
where loc='Bucuresti';
când un trigger e creat, codul sursă al triggerului este stocat în dicţionarul de date in
user_triggers si se poate afisa:
Gestiunea triggerilor:
-5-
Facultatea de Cibernetică, Statistică şi Informatică Economică
SGBD Oracle – seminarul 10
Exemplu:
ALTER TABLE produse
ENABLE ALL TRIGGERS;
Observatie: In momentul stergerii unei tabele se sterg automat toti triggerii asociati acelei tabele.
PL/SQL stochează triggerii în forma compilată la fel ca procedurile, funcţiile şi pachetele.
Aceasta permite triggerilor să fie apelaţi fără recompilare.
-6-