Vous êtes sur la page 1sur 11

LANGAGE PL/SQL

TRIGGERS

2022-2023 Enis BELHASSEN (enis.belhassen@gmail.com)


Triggers en PL/SQL
2

 Un trigger est un programme PL/SQL exécuté quand un


événement arrive : INSERT, UPDATE ou DELETE

 La forme générale d'un trigger est :


CREATE [OR REPLACE] TRIGGER nom_trigger
{BEFORE | AFTER } INSERT ou UPDATE ou DELETE
ON table_mis_à_jour
[ ... options supplémentaires...]
[DECLARE
définition_variables_constantes]
BEGIN
instructions
[EXCEPTION
programmation_exceptions]
END;
Triggers en PL/SQL
3

 ORACLE propose deux types de triggers :


◼ les triggers de table (STATEMENT) : sont déclenchées une seule fois.
◼ les triggers de ligne (ROW) : se déclenchent individuellement pour
chaque ligne de la table affectée par le trigger

 Un trigger est activé dès sa création


◼ Commande pour désactiver un trigger :
ALTER TRIGGER nom_trigger DISABLE;
◼ Commande pour activer un trigger :
ALTER TRIGGER nom_trigger ENABLE;

 Commande pour supprimer un trigger :


DROP TRIGGER nom_trigger;
Triggers en PL/SQL - after insert
4

 Afficher un message après l'insertion d'un employé


create or replace trigger monTrigger1
after insert on emp
begin
dbms_output.put_line('Insertion effectuee');
end;

 Test avec une requête insert :


SQL> insert into emp (empno) values (123);
Insertion effectuee <-- message affiché par le trigger

1 ligne crÚÚe. <-- message affiché par Oracle (SQLPlus)


Triggers en PL/SQL - after update
5

 Afficher un message après la mise à jour d’un ou de plusieurs


employés

create or replace trigger monTrigger2


after update on emp
begin
dbms_output.put_line('MAJ Terminee');
end;

 Test avec une requête update :


SQL> update emp set sal=sal*1.2 where deptno=10;
MAJ terminee

3 lignes mises Ó jour.


Triggers en PL/SQL - after update
6

 Afficher un message après la mise à jour d’un attribut spécifié


create or replace trigger monTrigger2
after update of sal on emp
begin
dbms_output.put_line('Update Salaire');
end;

 Test avec des requêtes update :


SQL> update emp set sal = sal*1.2 where deptno = 10;
Update Salaire <-- Mise à jour du salaire : trigger exécuté

3 lignes mises Ó jour.

SQL> update emp set comm = 0 where deptno = 20;

5 lignes mises Ó jour.<-- Mise à jour comm : trigger non exécuté


Triggers en PL/SQL - FOR EACH ROW
7

 Une fois lancé, un trigger peut exécuter son code pour chaque
tuple touché par la mise à jour : utiliser la clause FOR EACH ROW
create or replace trigger monTrigger2
after update of sal on emp for each row
begin
dbms_output.put_line('Update Salaire');
end;
/

 Test avec une requête update :


SQL> update emp set sal = sal*1.2 where deptno = 10;
Update Salaire <-- Message affiché pour chaque ligne màj
Update Salaire
Update Salaire

3 lignes mises Ó jour.


Triggers en PL/SQL - FOR EACH ROW
8

 On peut accéder aux valeurs des champs avant et après la mise


à jour : valeurs préfixées par OLD et NEW
create or replace trigger monTrigger2
after update of sal on emp for each row
begin
dbms_output.put_line(:new.ename||' - Nouveau Sal: '||
:new.sal||' - Ancien Sal : ' || :old.sal);
end;
/
 Test avec une requête update :
SQL> update emp set sal = sal*1.2 where deptno = 10;
KING - Nouveau Sal: 6000 - Ancien Sal : 5000
CLARK - Nouveau Sal: 2940 - Ancien Sal : 2450
MILLER - Nouveau Sal: 1560 - Ancien Sal : 1300

3 lignes mises Ó jour.


Triggers en PL/SQL - FOR EACH ROW
9

 On peut filtrer sur quels tuples sera exécuté le corps du trigger :


clause WHEN
create or replace trigger monTrigger2
after update of sal on emp for each row
when (old.sal < 3000)
begin
dbms_output.put_line(:new.ename||' - Nouveau Sal: '||
:new.sal||' - Ancien Sal : ' || :old.sal);
end;
/
 Test avec une requête update :
SQL> update emp set sal = sal*1.2 where deptno = 10;
CLARK - Nouveau Sal: 3528 - Ancien Sal : 2940
MILLER - Nouveau Sal: 1872 - Ancien Sal : 1560

3 lignes mises Ó jour.


Triggers en PL/SQL
PRÉDICATS INSERTING, DELETING ET UPDATING
10

 Un trigger peut comporter plusieurs instructions de


déclenchement : INSERT or DELETE or UPDATE

 On peut utiliser des prédicats conditionnels (INSERTING,


DELETING et UPDATING) pour exécuter des blocs de code
spécifiques pour chaque instruction de déclenchement.

 Le prédicat UPDATING peut être suivi d'un nom de colonne :


UPDATING ('nom_colonne')
Triggers en PL/SQL
PRÉDICATS INSERTING, DELETING ET UPDATING
11
Soit la table log suivante :
CREATE TABLE log
(date_log date, nom_table varchar2(20),
nom_user varchar2(20), action varchar2(50));

Exemple d’un Trigger avec plusieurs conditions de déclenchement:


CREATE OR REPLACE TRIGGER log_emp
AFTER INSERT OR UPDATE OR DELETE ON Emp FOR EACH ROW
DECLARE
v_action varchar2(50);
BEGIN
IF INSERTING THEN v_action := 'INSERT EMP NUM : '||:new.empno;
ELSIF UPDATING THEN v_action := 'UPDATE EMP NUM : '||:new.empno;
ELSIF DELETING THEN v_action := 'DELETE EMP NUM : '||:old.empno;
END IF;
INSERT INTO log (date_log, nom_table, nom_user, action)
VALUES (sysdate, 'EMP', substr(USER, 1, 20), v_action);
END ;
/

Vous aimerez peut-être aussi