Vous êtes sur la page 1sur 22

Les triggers

d'Oracle

Pr. M. Ben Salah


1

Dfinition & gnralit


Un trigger et une squences dactions, dfinis par le programmeur, qui se
dclenche lors de loccurrence dun vnement particulier
Lexcution dun dclencheur nest pas explicitement opre par une
commande ou dans un programme, cest lvnement (mise jour de la
table ou de la vue ) qui excute automatiquement le code programm
dans le dclencheur.

Un trigger est un un objet stock (comme une table ou une procdure).


Utilit :
- programmer toute les rgles de gestion qui nont pas pu tre mise en
place par des contraintes au niveau des tables.
- Programmer lintgrit rfrentielle et la rplication dans des
architectures distribues avec lutilisation de liens de base de donnes

Dfinition & gnralit

Les dclencheurs existent depuis la version 6 dOracle.


Ils sont compilables depuis la version 7.3 (auparavant, ils taient valus
lors de lexcution).
Version 8 : apparition des dclencheur INSTEAD OF
permet la mise jour de vues multitables.

Dfinition & gnralit

Les vnement dclencheurs :


- une instruction INSERT, UPDATE, DELET sur une table ou une vue
on parle de dclencheurs LMD
- une instruction CREATE, ALTER, ou DROP sur un objet (table ). On
parle de dclencheur LDD
-

Mcanisme gnral
Les tapes :
- coder le dclencheur
- le compiler == > il sera stock ainsi en base
si le dclencheur est actif
chaque vnement qui caractrise
le dclencheur aura pour
consquence son excution

1- dclaration

CREATE OR REPLACE
TRIGGER trig1
{BEFORE|AFTER| INSTEAD OF}
Nature de lvnement e1
Bloc PL/SQL

2- compilation

3- vnement e1

trig1

4- Action cod dans trig1

Conditions pour crer et modifier un triger

Conditions ncessaires pour crer un trigger


disposer des privilge CREATE TRIGGER
sur la table sur laquelle on veut dfinir le trigger il faut :
tre propritaire de la table
ou possder le privilge ALTER sur la table
ou possder le privilge ALTER ANY TABLE
Modification de triggers
- on refait une instruction CREATE OR REPLACE TRIGGER
- ou bien on supprime le trigger : DROP TRIGGER nomtrigger
et on le cre nouveau.

Cration de triggers
nom-trigger :doit tre unique dans un
mme schma

Cration du trigger

Pour les vue

CREATE [OR REPLACE] TRIGGER nom_trigger


{BEFORE|AFTER | INSTEAD OF}

table ou vue associ au


dclencheur

**)

{INSERT|DELETE|UPDATE [OF cole1 ..]} ON <[schma.]nomTable|nomVue>


[FOR EACH ROW ]
nature de
[WHEN (<condition>)]]
lvnement
DECLARE ............ <<<<dclarations>>>>
BEGIN
............ <<<< bloc d'instructions PL/SQL>>>>
END;

Cur du trigger

prcise le moment de
l'excution du trigger

**) Pour UPDATE, on peut spcifier une liste de colonnes. Dans ce cas, le trigger ne se dclenchera que
si l'instruction UPDATE porte sur l'une au moins des colonnes prcise dans la liste

Cration de triggers

la taille dun dclencheur ne peut excder 32 ko == > conseille : limiter la


taille (partie instructions) dun dclencheur soixante lignes de code
PL/SQL
=> contournement : appeler des sous- programmes dans le code du
dclencheur.
Un dclencheur ne peut valider aucune transaction
== > les instructions suivantes sont interdites :
COMMIT, ROLLBACK, SAVEPOINT
Attention ne pas crer de dclencheurs rcursifs (exemple dun
dclencheur qui excute une instruction lanant elle-mme le dclencheur
ou deux dclencheurs sappelant en cascade jusqu loccupation de toute
la mmoire rserve)
8

Dclencheur de ligne (row triggers)


Dclencheur de ligne
dclar avec la directive : FOR EACH ROW

pseudo-enregistrements
:NEW et :OLD
Utilis dans les trigger ligne
Rfrence aux colonnes dune table : trigger ligne
Dans un trigger ligne, on doit pouvoir accder aux ancienne et nouvelle valeurs de
colonne de la ligne.
on peut accder aux nouvelles valeurs des colonnes de la ligne affecte par la
mise jour prvue par lvnement :
La nouvelle valeur est appele :
:new.nomcolonne
on peut accder aux anciennes valeurs des colonnes de la ligne affecte par la
mise jour prvue par lvnement :
L'ancienne valeur est appele :
:old.nomcolonne
les nouvelles valeurs sont dans
dclencheur sur INSERT,

:new.<nom attribut>

dclencheur sur UPDATE

:new.<nom dattribut>
Pas daccs llment NEW
(qui nexiste plus)

dclencheur sur DELETE

les anciens valeurs sont dans


Pas daccs llment OLD
(qui nexiste pas)
:old.<nom dattribut>.
:old.<nom dattribut
10

Exemple dutilisation de :NEW


un pilote ne doit pas tre qualifi sur plus de trois types davions

Qualifications

Pilote
Brevet nom
PL-1 J.M toto
PL-2 T. Guibert
Michel
PL-3
Tuf

nbhvol
450

comp
AF

nbqualif
3

3400

AF

900

SING

brevet
PL-1
PL-1
PL-1
PL-2
PL-3

typeA
A340
A340
A320
A320
A330

expire
22/06/2005
05/02/2005
16/01/2004
18/01/2004
22/01/2006

question : comment grer des insertion dans la table Qualifications pour rpondre la contrainte cidessus

insert into Qualification values(PL-2,A380,20-06-2006);


:New.brevet
11

Exemple dutilisation de :NEW


Lexcution de cette instruction :
insert into Qualifications values(PL-2,A380,20-06-2006);

doit dclencher le trigger ci-aprs


vnement : before insert
CREATE OR REPLACE TRIGGER T_INSQualif
BEFORE INSERT ON ualifications
FOR EACH ROW
DECLARE
v_compteur Pilote.nbhvol%type;
v_nom Pilote.nom%type;
BEGIN
SELECT nbqualif, nom into v_compteur, v_nom from Pilote where brevet=:New.brevet;
if v_compteur <3 THEN
Update Pilote set nbqualif= nbqualif + 1 ;
where brevet=:New.brevet;
else
RAISE_APPLICATION_ERROR(-20100, 'le pilote' || v_nom || ' a dj 3 qualifs');
END IF;
END;

Exemple dutilisation de :OLD


Exemple dutilisation de :OLD

CREATE TRIGGER T_delQualif


AFTERE DELET ON Qualifications
FOR EACH ROW
BEGIN
UPDATE Pilote set nbqualif =nbqualif-1
where brevet=:OLD.brevet;
END;

13

- Exemple de trigger avec exception :


CREATE TRIGGER T_INSQualif
BEFORE INSERT ON Qualifications
FOR EACH ROW
DECLARE
v_compteur Pilote.nbhvol%type;
v_nom Pilote.nom%type;
BEGIN
SELECT nbqualif, nom into v_compteur, v_nom from Pilote where brevet=:New.brevet;
if v_compteur <3 THEN
Update Pilote set nqualif= nqualif + 1 where brevet=:New.brevet;
else
RAISE_APPLICATION_ERROR(-20100, le pilote || v_nom a dj 3 qualifs);
END IF;
EXCEPETION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20101, pas de pilote de code || :NEW.brevet);
WHENE OTHERS
RAISE_APPLICATION_ERROR(-20102, erreur oracle);
END;

14

Condition dans un dclencheur (WHEN)


Possibilit de restreindre lexcution du trigger : WHEN
CREATE OR REPLACE TRIGGER T_INSQualif
BEFOR INSERT ON Qualifications
FOR EACH ROW
WHEN (NEW.typeA=A320 OR NEW.typeA=A340)
DECLARE
v_compteur Pilote.nbhvol%type;
v_nom Pilote.nom%type;
BEGIN
SELECT nbqualif, nom into v_compteur, v_nom from Pilote where
brevet=:New.brevet;
if v_compteur <3 THEN
Update Pilote set nqualif= nqualif + 1 where brevet=:New.brevet;
else
RAISE_APPLICATION_ERROR(-20100, le pilote || v_nom a dj 3 qualifs);
END IF;
END;
15

Regroupement dvnement
Les prdicats conditionnels INSERTING, DELETING et UPDATING
Possibilit de regrouper des vnements (INSERT, UPDATE ou DELETE) au sein dun
mme dclencheur sils sont de mme type (BEFORE ou AFTER).
utiliser des prdicats conditionnels (INSERTING, DELETING et UPDATING) pour
excuter des blocs de code spcifiques pour chaque instruction de dclenchement.

CREATE TRIGGER ...


BEFORE INSERT OR UPDATE ON nomTable
.......
BEGIN
......
IF INSERTING THEN ....... END IF;
IF UPDATING THEN ........ END IF;
......
END;

- viter de programmer plusieurs fois la


mme action par lintermdiaire des
diffrents dclencheurs .
- si vous regrouper plusieurs
dclencheurs mono-vnement en 1
seul, supprimer les dclencheurs
mono-vnements (DROP TRIGGER)

16

Regroupement dvnement
UPDATING peut tre suivi d'un nom de colonne :
CREATE TRIGGER ...
BEFORE UPDATE OF salaire, commission ON employe
.......
BEGIN
......
IF UPDATING ('salaire') THEN ........
END IF;
......
END;

17

Dclencheur INSTEAD OF
Permet de mettre jour une vue multitable qui ne pouvait pas tre modifie
directement par INSERT, UPDATE ou DELETE
ne font pas intervenir les options BEFORE et AFTER.
Ne sutilise que pour des vues
Pas possible de spcifier une liste de colonne s dans un dclencheur INSTEAD
OF UPDATE

18

Dclencheur INSTEAD OF
Exemple :

pilote

compagni
compe
nrue
CREATE VIEW VueCompPil
AS SELECT c.comp, c.nomcomp, p.brevet,
p.nom, p.nbHvol
FROM Pilot p, Compagnie c
WHERE p.comp = c.comp

AF
SING

124
7

rue
rue 1
rue2

ville
Paris
Singapour

nomComp
Air France
Singapore AL

== > insert INTO Vue VueCompPil

Values (AERIS, Aris Toulouse,PL4,Pascal Larrazet, 5600);


== > le dclencheur qui gre les insertion dans la vue est charg dinsrer ,
chaque nouvel ajout, un enregistrement dans chacun des deux tables
19

Dclencheur INSTEAD OF
- Exemple :
CREATE OR REPLACE TRIGGER T_ VueCompPil
INSTEAD OF INSERT ON VueCompPil
FOR EACH ROW
DECLARE
V_comp NUMBER;
V_pil NUMBER;
BEGIN
select count(*) into v_pil from Pilot where brevet=:new.brevet
select count(*) into v_comp from compagnie where comp=:new.comp
if(v_pil >0) then
RAISE_APPLICATION_ERROR(-20103, le pilote existe dj);
else if v_pil=0 THEN
insert into Pilote values(:new.brevet, :new.nom, );
End if;
IF v_comp=0 THEN insert into Compagnie values(:new.comp, null,null, ,
new.nomComp);
ELSE RAISE_APPLICATION_ERROR(-20103, la compagnie existe dj);
END;

20

Activer/dsactiver

Par dfaut, un trigger est activ ds sa cration.


Pour dsactiver le trigger :
ALTER TRIGGER nomTrigger DISABLE;
Pour dsactiver tous les trigger sur une table :
ALTER TABLE nomTable DISABLE ALL TRIGGERS;

Pour activer un trigger :


ALTER TRIGGER nomTrigger ENABLE;
Pour activer tous les trigger sur une table :
ALTER TABLE nomTable ENABLE ALL TRIGGERS;

21

Information sur les triggers

Recherche dinformation sur les triggers


- Les dfinitions des triggers sont stockes dans :
USER_TRIGGERS, ALL_TRIGGERS et DBA_TRIGGERS

22

Vous aimerez peut-être aussi