Objectifs Les triggers - filcaronc/BDD/triggersPar4.pdf · I sous Oracle, aussi triggers INSTEAD OF...

Preview:

Citation preview

Les triggers

1 / 18

Les triggers

Anne-Cecile Caron

Licence MIAGE - Bases de Donnees

2015-2016

Les triggers

Introduction

2 / 18

ObjectifsApres ce cours, les TD et TP correspondants, vous devez etre capablesde

I Ecrire en PL/SQL des triggers lies aux tables.I Utiliser a bon escient le parametrage des triggers :

I trigger ligne ou instructionI trigger before ou after

I Dans le cas d’un trigger ligne, utiliser correctement new et old

I Dans le cas d’un trigger ligne, utiliser la clause When

I Utiliser les predicats updating, inserting, deleting

I Comprendre donc eviter les erreurs de table en mutation.

Les triggers

Introduction

3 / 18

DefinitionI Un trigger est un programme qui se declenche automatiquement

suite a un evenement) A la di↵erence d’une procedure stockee, on ne peut pas appelerun trigger explicitement.

I En base de donnees, l’evenement est une instruction du DML quimodifie la base.(INSERT, DELETE, UPDATE)

I Ces triggers font partie du schema de la base. Leur code compile estconserve (comme pour les programmes stockes)

I Ils font partie de la norme SQL3.

I sous Oracle, aussi triggers INSTEAD OF sur les vues, et triggerssystemes

Les triggers

Introduction

4 / 18

Pourquoi ?I Les triggers peuvent servir a verifier des contraintes que l’on ne peut

pas definir de facon declarative

I Ils peuvent aussi gerer de la redondance d’information.

I Ils peuvent aussi servir a collecter des informations sur lesmises-a-jour de la base.

Les triggers

Structure d’un trigger

5 / 18

Syntaxe

CREATE [OR REPLACE] TRIGGER <nom_trigger><instant> <liste_evts>ON <nom_table> [FOR EACH ROW][WHEN ( <condition> ) ]<corps>

<instant> ::= AFTER | BEFORE<liste_evts> ::= <evt> {OR <evt>}<evt> ::= DELETE | INSERT |

UPDATE [OF { <liste_cols> }]<liste_col> ::= <nom_col> { , <nom_col> }<corps> corps de pgme PL/SQL

Les triggers

Structure d’un trigger

6 / 18

Entete du triggerOn definit

I la table,

I les instructions du DML qui declenchent le trigger

I le moment ou le trigger va se declencher par rapport a l’instructionDML (avant ou apres)

I si le trigger se declencheI une seule fois pour toute l’instruction (i.e. trigger instruction),I ou une fois pour chaque ligne modifiee/inseree/supprimee.

(i.e. trigger ligne, avec l’option FOR EACH ROW)

I et eventuellement une condition supplementaire de declenchement(clause WHEN) pour les triggers ligne

Les triggers

Structure d’un trigger

7 / 18

AFTER ou BEFORE ?I Si le trigger doit determiner si l’instruction DML est autorisee :

utiliser BEFORE

I Si le trigger doit ”fabriquer” la valeur d’une colonne pour pouvoirensuite la mettre dans la table : utiliser BEFORE.Par exemple : trigger ligne qui fabrique la valeur de clef primaire apartir d’une sequence.

I Si on a besoin que l’instruction DML soit terminee pour executer lecorps du trigger : utiliser AFTER

I pour des triggers lignes, il se peut que l’utilisation de Before ouAfter n’ait aucune importance.

Les triggers

Structure d’un trigger

8 / 18

Trigger ligne ou instruction ?1. Trigger ligne :

- notion de ligne courante, :old designe la ligne avant modificationet :new designe la ligne apres modification.

:old :newinsert null valeur insereedelete valeur supprimee nullupdate valeur avant modif valeur apres modif

- et possibilite de limiter le declenchement par la clause WHEN

2. Trigger instruction :Le trigger est execute une fois pour l’ensemble de l’instruction) pas de notion de ligne courante.

Les triggers

Structure d’un trigger

9 / 18

Ordre d’execution des triggersPour une instruction du DML sur une table de la base, il peut y avoir 4sortes de triggers possibles selon l’instant (before, after) et le type(instruction ou ligne).Ces triggers se declenchent dans l’ordre suivant :

I Trigger(s) instruction BEFOREI Pour chaque ligne concernee

I Trigger(s) ligne BEFOREI Trigger(s) ligne AFTER

I Trigger(s) instruction AFTER

Les triggers

Structure d’un trigger

10 / 18

Clause WHENOn peut definir une condition pour un trigger ligne : le trigger sedeclenchera pour chaque ligne verifiant la condition.

Create or replace trigger journal_emp

after update of salary on EMPLOYEE

for each row

when (new.salary < old.salary)

begin

insert into EMP_LOG(emp_id, date_evt, msg)

values (:new.empno, sysdate, ’salaire diminue’);

end ;

Attention syntaxe : dans la clause when il n’y a pas de ” :” devant new et old

Les triggers

Structure d’un trigger

11 / 18

Clause WHEN (2)

Empno salary

3000

1700

2100

4100

1654

9675

5467

2543

1654

9675

5467

2543

Empno salary

2000

2000

2000

4100

Update EMPSet salary = 2000Where salary < 4000

3 lignes modifiées

Emp_id date_evt msg

1654

5467 03/10/12

03/10/12

Salaire diminué

Salaire diminué

EMP EMP

EMP_LOG

Le trigger se déclenche 2 fois.

Les triggers

Structure d’un trigger

12 / 18

Corps du triggerI bloc PL/SQL

I predicat INSERTING (resp. UPDATING, DELETING) qui vaut vraissi le trigger a ete declenche par un INSERT (resp UPDATE,DELETE)

I pseudo-tuples :new et :old pour les triggers lignes

IIl ne faut pas, dans un trigger ligne, interroger une table qui

est en cours de modification (probleme de table en mutation).

Les triggers

Exemples

13 / 18

Exemple 1

create or replace trigger clef_autobefore inserton T1for each rowwhen (new.c1 is null)declare

la_clef number ;begin

select nvl(max(c1),0)+1 into la_clef from T1 ;:new.c1 := la_clef ;

end ;

insert into T1(c2) values (’abc’);--> ligne (2,’abc’)insert into T1 values (10,’def’);--> ligne(10,’def’)insert into T1(c2) values (’ghi’);--> ligne(11,’ghi’)

insert into T1(c2)select c2 from T1bis;

ORA-04091: la table CARON.T1est en mutation ;le declencheur ou la fonctionne peut la voir...

Les triggers

Exemples

14 / 18

Exemple 1 (suite)create table T1(

c1 number(3)constraint t1_pkey primary key,c2 varchar2(20)

);

create sequence seqincrement by 1start with 1 ;

create or replace trigger clef_autobefore inserton T1for each row-- ne pas mettre la clause WHEN-- du trigger precedent !begin

select seq.NEXTVALinto :new.c1 from dual ;

end ;

insert into T1(c2) values (’coucou’) ;

select * from T1;C1 C2----------------------------1 coucou

Remarque : il faut definir un trigger pour empecher de modifier c1, A FAIRE EN

EXERCICE

Les triggers

Exemples

15 / 18

Exemple 2On reprend l’exemple du Commerce, donne aux cours precedents.

alter table client add(nbCmdes NUMBER default 0 not null);

-- on met a jour Client en fonction des commandes qui existent dejaupdate clientset nbCmdes = (select count(*) from commande

where commande.num_client = client.num_client);

-- un trigger instruction pour les futures commandescreate or replace trigger calcul_nbcmdesafter insert or delete or update of num_clienton commandebegin

update clientset nbCmdes = (select count(*) from commande

where commande.num_client = client.num_client);end ;

Les triggers

Exemples

16 / 18

Exemple 2 (suite)I Dans le transparent precedent, le trigger recalcule tous les nbCmdes,

meme pour des clients pour qui ce nombre n’a pas change.

I Si on definit un trigger ligne au lieu d’un trigger instruction, on peutne faire que les calculs necessaires

create or replace trigger calcul_nbcmdesafter inserton commandefor each rowbegin

update client set nbCmdes = nbCmdes+1where num_client = :new.num_client ;

end ;-- faire la meme chose pour delete et update

Les triggers

Exemples

17 / 18

Exemple 2 (suite et fin)On peut faire 1 seul trigger pour les 3 cas : insert, update, delete.

create or replace trigger calcul_nbcmdesafter insert or delete or update of num_clienton commandefor each rowbegin

if inserting or updating thenupdate client set nbCmdes = nbCmdes+1where num_client = :new.num_client ;

end if ;if deleting or updating then

update client set nbCmdes = nbCmdes-1where num_client = :old.num_client ;

end if ;end ;

Les triggers

Exemples

18 / 18

SyntheseI programmes dont l’execution est declenchee par les instruction du

DML

I pratiques pour verifier des contraintes que l’on ne peut pas declarerdans le schema.

I Ne pas en abuser !I interdependance entre triggers qui peut etre di�cile a gerer, cascade

de triggers.I cout

Recommended