Upload
lachir
View
215
Download
0
Embed Size (px)
Citation preview
8/6/2019 Les Declencheurs
1/7
Les dclencheurs(Trigger) TS Base de donnes PROF : Mme Aissat
Page | 1
Implmentation des dclencheurs(les Triggers)
Objectifpdagogique :
A la fin de la sance, le stagiaire sera capable
y de crer des triggers en utilisant linstruction CREATE TRIGGERy dimplmenter la vrification des contraintes dintgrit
rfrentielle et les contraintes de gestion en utilisant les
triggers.
Plan :
Introduction
1. Cration dun dclencheur DML2. Rles des dclencheur DML3. Principe de fonctionnement.4. Suppression dun dclencheur5. Exemples
8/6/2019 Les Declencheurs
2/7
Les dclencheurs(Trigger) TS Base de donnes PROF : Mme Aissat
Page | 2
1. Introduction :
Un dclencheur est une procdure stocke spciale qui s'excute automatiquement lorsqu'un
vnement se produit dans le serveur de base de donnes. Les dclencheurs DML s'excutent lorsqu'un
utilisateur essaie de modifier des donnes via un vnement DML. Les vnements DML sont des
instructions INSERT, UPDATE ou DELETE excutes sur une table ou une vue. Ces dclencheurs
s'activent au dclenchement d'un vnement valide, que des lignes de table soient affectes ou non.Les dclencheurs du DDL repose sur le mme principe, savoir associer lexcution dune procdure stocke lexcution dune instruction CREATE, ALTER DROP, GRANT, DENY, REVO
KE et UPDATE STATISTICS.Nous allons aborder uniquement les dclencheurs DML dans ce cours.
2. Rles des dclencheur DMLLes triggers DML dfinis sur la base de donnes ont deux rles principaux:
- contrler que les donnes manipules vrifient lintgrit rfrentielle
Exemple: crer un nouveau stagiaire ncessite de laffecter une spcialit
- mettre en uvre des traitements correspondant une rgle de gestion de lentrepriseExemple: lorsquun produit est pass en commande, on mettra jour la quantit disponible enstock dans la table Produits
3. Cration dun dclencheur DMLLes dclencheurs ne peuvent tre crs que par le T-SQL.
Syntaxe :
CREATETRIGGERnom_triggerON{table|vue}
{FOR|AFTER|INSTEADOF}{ INSERT,UPDATE,DELETE}[ WITH APPEND ] [ NOT FOR REPLICATION ]AS[ IF UPDATE ( colonne )| IF ( COLUMNS_UPDATED ( )oprateur_comparaison_bits)] Instructions_SQL
Comme tout objet de BD, un trigger est identfi par son nom nom_trigger
y ON : spcifie la table ou la vue sur laquelle le dclencheur ou les actions dfinies serontexcutes.
y FOR:est quivalent AFTER ( viter dans les nouvelles versions)y AFTER: Cest le mode par dfaut des dclencheurs. Le code est excut aprs vrification de
s contra-intes dintgrit et aprs modification des donnes.y INSTEADOF
Le corps du dclencheur est excut la place de lordre SQL envoy sur la table ou la vue.
y INSERT, UPDATE,DELETEUn dclencheur peut agir par rapport une ou plusieurs actions. Dans ce cas, on sparera les actions
par des virgules.
y IF UPDATE (colonne)Ne peut tre utilis que pour les dclencheurs UPDATE ou INSERT et ne sexcutera que si la ou
les colonnes sont concernes.
8/6/2019 Les Declencheurs
3/7
Les dclencheurs(Trigger) TS Base de donnes PROF : Mme Aissat
Page | 3
y IF ( COLUMNS_UPDATED ( ) oprateur_comparaison_bits) :Cette fonction permet de connatre les indices de la ou des colonnes qui ont t mises jour. Pour chaq
ue colonne affecte par la mise jour, un bit est lev. Pour savoir quelles ont t les colonnes
mises jour, une simple comparaison binaire suffit.
y Instructions_SQLIl est possible dutiliser toutes les instructions Transact SQL de manipulations de donnes
(DML). Cependant, Les instructions suivantes ne sont pas autorises :y CREATE et DROP.y ALTER TABLE et ALTER DATABASE.y TRUNCATE.y GRANT et REVOKE.y UPDATE STATISTICS.y RECONFIGURE.4. Principe de fonctionnement.
Deux tables virtuelles sont cres au moment de la mise jour (insertion,suppression ou modification)
de la table: INSERTED et DELETED.Elles sont destines contenir les lignes de la table sur lesquelles ont t effectues des oprations.
Les tables INSERTED et DELETED peuvent tre utilises par le trigger pour dterminer comment letraitement doit se drouler.
Les mcanismes dutilisation par SQL Server de ces deux tables diffrent en fonction de lopration
effectue sur la table contenant le ou les triggers.
y Cas de suppression dune ligne de table (delete)La/les lignes supprimes sont places dans la table temporaire DELETED et supprimes de la
table relle; la table DELETED et les tables de la base ne peuvent pas avoir de lignes en commun.
y Cas de cration dune ligne de table (insert)La/les lignes nouvelles sont places dans la table temporaire INSERTED et dans la
table relle; toutes les lignes de la table INSERTED apparaissent dans la table de labase.
y Cas de modification dune ligne de table (update)La/les lignes avant modification sont places dans la table temporaire DELETED et la/les
lignes aprs modification sont places dans la table temporaire INSERTED et dans la table
relle.
5. Suppression dun trigger.la procdure SQL Server DROP TRIGGER supprime un Trigger.
Syntaxe :
DROPTRIGGERnom_trigger
8/6/2019 Les Declencheurs
4/7
Les
c e c e
s
e
S B se
e
es
F
e
ss
e | 4
6. EXEMPLES : Voyons t s des exemples chaque partie de la syntaxe:
AFTER INSERT
Un dclencheur d'insertion est un dclencheur DM qui agit quand un nouvel enregistrement est
ajout sa table.
Sy! " # xe :CREATETRIGGERnom_triggerON{table|vue}
AFTERINSERTAS
Instructions_SQL
Exemple 1 :
-- un trigger qui permet de donner la date systme la dateCom-- aprs l'insertion de nouvelles commandes
USE BdconsommableGOCREATETRIGGERAjout_commandeONCommandeAFTERINSERTASBegin
UPDATECommandeSETDATECOM=GETDATE()
end;
Ajoutons une ligne comme suit:
INSERTINTOCommande(Numcom,obscom,numfou)
VALUES ('10100','RAS','00120')A laffic $ age :
Re % arquons la date de la commande:
AFTER UPDATE Un dclencheur de mise jour est un dclencheur DM qui agit quand un nouvel
enregistrement est modi i.
Syntaxe :CREATETRIGGERnom_triggerON{table|vue}
AFTERUPDATEAS
Instructions_SQL
AFTER DELETE Un dclencheur de suppression est un dclencheur DM qui agit quand
une suppression est opre surla table.
8/6/2019 Les Declencheurs
5/7
Les dclenc & eurs '(
rigger) TSBase de donnes PROF: MmeAissat
Page| 5
Synt)
xe:
CREATETRIGGERnom_triggerON{table|vue}AFTERDELETE
ASInstructions_SQL
Exemple2 :Le dclencheur suivant empche la suppression plus dune ligne de la table ligcom
USEBDconsommableGOCREATETRIGGERSup_ligcomONligcomAFTERDELETEASBegin
if (select count(*)fromdeleted)>1begin
rollbackprint'vous ne pouvez pas supprimer plus de 1 ligne'
end;end;
Pourtesterle dclencheur:
DELETEligcom
Aprs excution :
Exemple 3 :
-- le dclencheur suivant traduit la rgle de gestion "le stocke d'alerte doit-- tre > ou gale 50CREATETRIGGERMod_produitonproduit
AFTERUPDATE,INSERTASBEGIN
DECLARE@N1char(4)SET@N1=(SELECT stkalefrominserted)IFUPDATE(stkale)
beginif@N1< 50
beginROLLBACKTRANSACTIONRAISERROR('le stocke d''alerte doit tre > 50',16,1)
end;end;
end;
8/6/2019 Les Declencheurs
6/7
Les dclenc 0 eurs 1 Trigger) TSBase de donnes PROF: MmeAissat
Page| 6
pourtesterle dclencheur, effctuons un UPDATE et un INSERT dans la table produit:UPDATE PRODUIT
setstkale= 35wherecodeart='D001'
ouINSERTINTOProduitVALUES
('D005','LAPTOP',20,100,'Unit')
Et dans les deux cas, lopration est abondonne:
I UP TETeste des actions UPDATE ou INSERT sur des colonnes spcifiques.
La syntaxe est :
CREATETRIGGERtrigger_nameONnom_table
AFTERINSERT,UPDATE,DELETEASBEGIN
IF (UPDATE (Chp1)AND|ORUPDATE (Chp2))BEGIN
[]ENDELSEBEGIN
[]END
END
Exemple 5:Le trigger suivant empche la modification du code du fournisseur.
CREATETRIGGERModif_CodeonFournisseurAFTERUPDATEASBEGIN
IfUPDATE(Numfou)begin
PRINT('Vous ne pouvez pas modifier le code')ROLLBACKTRANSACTION
end;END
Pourtesterle dclancheur:
UPDATEFournisseursetnumfou='00101'wherenumfou='00100'
8/6/2019 Les Declencheurs
7/7
Les dclencheurs(Trigger) TS Base de donnes PROF : Mme Aissat
Page | 7
INSTEADOF : Spcifie que le dclencheur DML est excut la place de l'instruction SQL de
dclenchement, remplaant ainsi les actions de celle-ci
Exemple 6:
ce dclencheur est excut la place de linstruction INSERT dans la table Fournisseur. Le nom du
fournisseur est converti en majuscule et si le champ confou nest pas prcis (= NULL) la valeurXXXXXX est insre.
CREATETRIGGERIsert_Fourn ONFournisseurINSTEADOFINSERT
ASBEGINDECLARE@nomfouvarchar(30)DECLARE@contfouvarchar(25)set@nomfou=(selectnomfoufrominserted)set@nomfou=upper(@nomfou)set@contfou=(selectcontfoufrominserted)if@contfouisNULLset@contfou='XXXXX'
INSERTINTOFournisseurvalues((selectnumfoufrominserted),@nomfou,(selectadrfoufrominserted),
(selectcpfoufrominserted),(selectsatisffrominserted),@contfou)END
Testons le dclencheur :INSERTINTOFournisseur(numfou,nomfou,adrfou,cpfou)values('00132','Sid houm Ouali' ,'TO',15000)