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.
BEGIN
dbms_output.put_line('triggerul s-a executat');
-1-
Facultatea de Științe Economice - SIG - Oracle – Laboratorul 10
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;
/
Verificarea execuţiei:
--inserarea in tabela
insert into produse (id_produs, denumire_produs) values (300, 'cafea');
--stergere
delete from produse where id_produs=300;
commit;
-2-
Facultatea de Științe Economice - SIG - Oracle – Laboratorul 10
Exemple:
--Se creează un trigger pentru a nu se permite depăşirea unei limite maxime a salariului unui
angajat
CREATE OR REPLACE TRIGGER restrict_salariul
BEFORE INSERT or UPDATE on angajati
FOR EACH ROW
DECLARE
v_sal_max number;
BEGIN
select salariu_max into v_sal_max from functii where id_functie= :new.id_functie;
IF :new.salariul>v_sal_max then
RAISE_APPLICATION_ERROR (-20202, 'Nu se poate depasi salariul maxim
pentru functia data');
end if;
END;
/
--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;
END;
/
show errors;
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_v
for each row
begin
if inserting then
insert into clienti (id_client, prenume_client, nume_client, limita_credit) values
(:new.id_client, :new.prenume_client, :new.nume_client, :new.limita_credit);
insert into comenzi (nr_comanda, data, id_client) values (:new.nr_comanda, :new.data,
:new.id_client);
end;
/
show errors;
-4-
Facultatea de Științe Economice - SIG - Oracle – Laboratorul 10
--testare trigger
insert into clienti_v values (10,'Ioan','Bucur',200,100,sysdate);
insert into clienti_v values (20,'Dana','Popa',250,110,sysdate);
select * from clienti where id_client in (10, 20);
select * from comenzi where id_client in (10, 20);
update clienti_v
set nume_client='Popescu'
where id_client=20;
select * from clienti where id_client in (10, 20);
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:
Exemplu:
ALTER TABLE produse
ENABLE ALL TRIGGERS;
-5-
Facultatea de Științe Economice - SIG - Oracle – Laboratorul 10
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-