Académique Documents
Professionnel Documents
Culture Documents
Version 1.0
Grgory CASANOVA
2 Les dclencheurs [09/07/09]
Sommaire
1 Introduction ..................................................................................................................................... 3
2 Pr-requis ........................................................................................................................................ 4
3 Les dclencheurs du DML ................................................................................................................ 5
3.1 Introduction ............................................................................................................................. 5
3.2 Cration dun dclencheur du DML ........................................................................................ 5
3.3 Suppression dun dclencheur du DML................................................................................... 8
4 Les dclencheurs du DDL............................................................................................................... 10
4.1 Introduction ........................................................................................................................... 10
4.2 Cration dun dclencheur du DDL ....................................................................................... 10
4.3 Suppression dun dclencheur du DDL.................................................................................. 14
5 Conclusion ..................................................................................................................................... 16
1 Introduction
Les dclencheurs sont des objets anciens de SQL Server, qui permettent deffectuer
automatiquement des taches administratives de maintient de la base de donnes. En effet, les
dclencheurs, ou triggers, vont nous permettre, dans leur gnralit, deffectuer des oprations
automatiques, lies une opration particulire sur un objet de la base, par lutilisateur. Plus
prcisment, lorsque un utilisateur va appliquer une opration du DML par exemple, sur une table, si
un dclencheur est dfinit sur cette table, une action automatique en rapport avec laction de
lutilisateur sexcutera. On commence alors de parler de la notion de programmation
vnementielle, en rapport au fait quun vnement en dclenche un autre.
2 Pr-requis
Pour comprendre au mieux ce chapitre, il est important :
- De connaitre les gnralits sur les bases de donnes relationnelles (Chapitre 2).
- De connaitre la plupart des instructions DDL de cration dobjets dans la base (Chapitre 2, 3,
5 et 6).
- Connaitre les gnralits du T-SQL DML (Chapitre 4).
3.1 Introduction
Les dclencheurs sont donc des objets de la base qui nous permettent dautomatiser des
actions. Quelle est la particularit des dclencheurs du DML ? Ils vont nous permettre deffectuer
une instruction, chaque fois quune instruction du DML est effectue pour une table donne.
Prenons un exemple pour mieux comprendre : Nous avons deux tables qui fonctionnent ensemble,
table1 et table2. Nous dfinissons un dclencheur du DML sur table1, qui fait en sorte que, si la table
table1 est mise jour, les valeurs correspondantes dans table2 soit mise jour de la mme manire.
Cest de cette manire que nous allons automatiser les actions sur les objets de la base. Pour une
instruction donne sur un objet, une action lie sexcutera la suite.
Une fois cette opration effectue, faites un clic droit sur le nud Dclencheurs et
choisissez loption Nouveau dclencheur . Un code auto gnr apparat alors, dans une
nouvelle fentre de requtes. Voici ce code :
-- ================================================
-- Template generated from Template Explorer using:
-- Create Trigger (New Menu).SQL
--
-- Use the Specify Values for Template Parameters
-- command (Ctrl-Shift-M) to fill in the parameter
-- values below.
--
-- See additional Create Trigger templates for more
-- examples of different Trigger statements.
--
-- This block of comments will not be included in
-- the definition of the function.
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE TRIGGER <Schema_Name, sysname, Schema_Name>.<Trigger_Name,
sysname, Trigger_Name>
ON <Schema_Name, sysname, Schema_Name>.<Table_Name, sysname,
Table_Name>
(AFTER | FOR | INSTEAD OF) <Data_Modification_Statements, ,
INSERT,DELETE,UPDATE>
[WITH APPEND][NOT FOR REPLICATION]
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
END
GO
Expliquons ce code. Tout dabord, linstruction CREATE TRIGGER est linstruction DDL qui va nous
permettre de crer un dclencheur. Il est ncessaire de prciser le nom du dclencheur la suite de
cette instruction, puisque comme tout objet de la base, un dclencheur peut tre mentionn dans du
code seulement grce son nom unique. La clause ON va nous permettre de dfinir sur quelle table
nous allons dfinir le dclencheur que nous crons et les clauses AFTER, INSTEAD OF nous
permettront par la suite, de donnes les conditions daction du dclencheur.
- AFTER : le dclencheur dexcutera aprs insertion, mise jour ou suppression dans la table
qui contient le dclencheur.
- INSTEAD OF : le dclencheur sexcutera avant insertion, mise jour ou suppression dans
la table qui contient le dclencheur.
Des options sont disponibles pour les triggers du DML, et elles sont les suivantes :
- WITH APPEND : Cette option permet dajouter plusieurs dclencheurs sur un mme objet et
un mme ordre SQL. Ceci est du un comportement diffrent des dclencheurs au passage
de la version compatible 65 et 70.
- NOT FOR REPLICATION : Le dclencheur dfini avec cette option ne sera pas pris en
compte dans un processus de modification des donnes par rplication.
Par exemple, aprs insertion dans la table prcise, faire ceci. Comme pour une fonction, les
dlimiteurs des actions dans un dclencheur sont les clauses AS BEGIN et END. Tout le code
prsent entre ces deux dlimiteurs sera excut, la seule condition que laction dclenchant le
dclencheur soit faite auparavant. Prenons maintenant un exemple concret pour illustrer nos propos.
Dans le code du script propos en annexe de ce cour, il y a un dclencheur du DML nous allons
lutiliser ici comme exemple.
Remarque : Les instructions suivantes ne sont pas autoriss dans le corps du dclencheur, savoir
CREATE, DROP, ALTER, TRUNCATE, GRANT, REVOKE, UPDATE STATISTICS, RECONFIGURE et LOAD.
Au travers de ce code T-SQL, nous crons un dclencheur, dont le nom est Soustraction_Stock,
sur la table commande. Nous y associons lvnement AFTER INSERT, qui prcise quaprs
insertions de donnes dans la table Commande, le code contenu entre les dlimiteurs AS BEGIN et
END doit tre excut. Le code contenu entre les dlimiteurs, dans cet exemple, rcupre certaines
valeurs insres dans la table Commande, en loccurrence Id_Stock et Quantit, dans des
variables dclares en dbut de lot grce aux mots cl FROM INSERTED, et soustrait la quantit de la
commande, la quantit du stock, en fonction dun Id_Stock donn, grce un UPDATE de la
table Stock. Les trois mots cl FROM UPDATED, FROM INSERTED, FROM DELETED nous permet
de rcuprer les valeurs insres, mises jour ou supprimes, avant lactivation du dclencheur.
Il est possible de voir les dclencheurs crs, en dployant les nuds des tables prvus cet effet,
comme montr ci-dessous, ou encore en utilisant la procdure stocke sp_helptrigger :
La structure gnrale de suppression par code T-SQL est la mme que pour nimporte quel objet de
la base puisque nous allons utiliser DROP. Voyons un exemple :
Il suffit simplement dajouter le mot cl TRIGGER pour spcifier que nous allons supprimer un
dclencheur, puis le nom de lobjet supprimer.
Par linterface graphique, tendez les nuds qui mnent la table qui contient vos dclencheurs,
comme ceci :
4.1 Introduction
SQL Server propose des dclencheurs du DDL. Ce type de dclencheur fonctionne de la mme
manire que les dclencheurs du DML, simplement, les objets affects par ces dclencheurs et les
instructions auxquelles ils ragissent ne sont pas les mmes. En effet, un trigger du DDL agit au
niveau dune base de donnes ou du serveur o il est dfini, alors quun dclencheur du DML agit
simplement pour la table ou la vue sur laquelle il est dfini. Dans ce dernier cas, le dclencheur est
stock dans la base de donnes MASTER. De plus, ceux du type DML ragissent des instructions du
DML, alors ceux du DDL ragissent des instructions du DDL, telles que CREATE, ALTER, DROP,
GRANT, REVOKE, DENY et UPDATE STATISTICS. Comme pour ceux du DML, les dclencheurs du DDL
sont excuts aprs linstruction DDL qui leur est attache. Le but principal de ce type dobjet est de
grer lajout et la suppression ou encore la mise jour dobjets dans la table, ou bien dautomatiser
celle-ci. Enfin, et cest la dernire diffrence entre les deux diffrents types de dclencheurs que sont
les DML et les DDL, il nest pas possible, contrairement un DML, de crer un dclencheur INSTEAD
OF de type DDL.
USE Entreprise
GO
Linstruction CREATE TRIGGER nous permet dannoncer que nous allons crer un dclencheur. Il est
ncessaire de prciser son nom la suite de cette instruction. Par la suite, on dfinit si ce
dclencheur est dfinit pour une base de donnes en particulier ou pour tout le serveur grce aux
mots cl ALL SERVER et DATABASE. Nous dfinirons ensuite les options WITH ENCRYPTION et
EXECUTE AS. La clause AFTER permet, comme pour un dclencheur du DML, de prciser aprs
quelle instruction le dclencheur doit tre activ. Ces instructions seront prsentes ci-aprs, dans
un tableau rsum. Les clauses AS BEGIN et END dfinissent le corps du dclencheur, c'est--dire
les actions effectuer dans le cas o celui-ci est activ.
Voici les instructions disponibles pour un dclencheur du DDL (Ces instructions ont deux cibles
distinctes, les objets du serveur ou les objets de la base. Nous dtaillerons les deux.):
- Tables :
DDL_TABLE_EVENTS
CREATE TABLE
ALTER_TABLE
DROP_TABLE
- Vues :
CREATE_VIEW
ALTER_VIEW
DROP_VIEW
- Synonymes :
CREATE_SYNONYM
DROP_SYNONYM
- Fonctions :
CREATE_FUNCTION
ALTER_FUNCTION
DROP_FUNCTION
- Procdures :
CREATE_PROCEDURE
ALTER_PROCEDURE
DROP_PROCEDURE
- Dclencheurs :
CREATE_TRIGGER
ALTER_TRIGGER
DROP_TRIGGER
- Notifications :
CREATE_EVENT_NOTIFICATION
DROP_EVENT_NOTIFICATION
- Index :
CREATE_INDEX
ALTER_INDEX
DROP_INDEX
- Statistiques :
CREATE_STATISTICS
UPDATE_STATISTICS
DROP STATISTICS
- Assemblies :
CREATE_ASSEMBLY
ALTER_ASSEMBLY
DROP_ASSEMBLY
- Types :
CREATE_TYPE
DROP_TYPE
- Users :
CREATE_USER
ALTER_USER
DROP_USER
CREATE_ROLE
ALTER_ROLE
DROP_ROLE
- Rles :
CREATE_APPLICATION_ROLE
ALTER_APPLICATION_ROLE
DROP_APPLICATION_ROLE
- Schmas :
CREATE_SCHEMA
ALTER_SCHEMA
DROP_SCHEMA
- Messages Types :
CREATE_MESSAGE_TYPE
ALTER_MESSAGE_TYPE
DROP_MESSAGE_TYPE
- Contrats :
CREATE_CONTRACT
ALTER_CONTRACT
DROP_CONTRACT
- Queues :
CREATE_QUEUE
ALTER_QUEUE
DROP_QUEUE
- Services :
CREATE_SERVICE
ALTER_SERVICE
DROP_SERVICE
- Route :
CREATE_ROUTE
ALTER_ROUTE
DROP_ROUTE
- Service Binding :
CREATE_REMOTE_SERVICE_BINDING
ALTER_REMOTE_SERVICE_BINDING
DROP_REMOTE_SERVICE_BINDING
- Secexprer :
CREATE_SECEXPR
DROP_SECEXPR
- XML :
CREATE_XML_SCHEMA
ALTER_XML_SCHEMA
DROP_XML_SCHEMA
- Fonction de partition :
CREATE_PARTITION_FUNCTION
ALTER_PARTITION_FUNCTION
DROP_PARTITION_FUNCTION
- Schmas de partition :
CREATE_PARTITION_SCHEME
ALTER_PARTITION_SCHEME
DROP_PARTITION_SCHEME
CREATE_LOGIN
ALTER_LOGIN
DROP_LOGIN
- Endpoints :
CREATE_HTTP_ENDPOINT
DROP_HTTP_ENDPOINT
GRANT_SERVER_ACCESS
DENY_SERVER_ACCESS
REVOKE_SERVER_ACCESS
- Certificats :
CREATE_CERT
ALTER_CERT
DROP_CERT
Certaines des actions DDL contenues dans la liste ci-dessus ne nous sont pas encore connues, tout
simplement parce quelles interviendront dans le cadre des cours sur ladministration de SQL Server,
ou bien parce que nous navons pas encore vu le cours correspondant dans le programme de la
partie dveloppement de base de donnes de SQL Server. La liste ci-dessus nest pas exhaustive.
USE Entreprise
GO
Dans ce cas l, pour chaque instruction du DDL faite pas un utilisateur quelconque, nous allons
insrer dans la table log_database la date, lutilisateur et le type dvnements quil a utilis, pour
constituer au final, une sorte de registre des actions DDL faites sur les tables. La dernire ligne de
linstruction INSERT (EVENTDATA().value('(/EVENT_INSTANCE/EventType) [1]','nvarchar(50)'))
nest pas connaitre pour le moment, puisque il sagit dun travail sur un fichier XML, ce qui fera
lobjet du chapitre suivant. Retenez simplement quil sagit dune mthode dextraction
dinformation dun fichier XML.
Voil ce quil ce passe lorsque nous crons une table, et que nous excutons le code suivant :
Un autre type de dclencheur existe, mme si on ne peut pas parler directement de type de
dclencheur puisquil fait partie des dclencheurs du DDL. Cest le type des triggers de connexion. Ils
se prsentent de la mme manire quun dclencheur DDL simple, seule une diffrence est noter ;
la prsence du mot cl FOR LOGON, comme dans la structure suivante :
Il faut faire trs attention avec les dclencheurs de connexions, car dans certains cas, ils peuvent
vous empcher une connexion au serveur.
On utilise donc linstruction suivie du nom unique du dclencheur. Il est par la suite ncessaire de
prciser si le dclencheur DDL est dfinit sur une base de donnes ou sur le serveur entier.
Il vous suffit dans un premier temps de dployer les nuds de lexplorateur dobjet de SSMS, jusqu
votre dclencheur de cette manire :
Il vous suffit alors simplement de faire un clic droit sur le dclencheur supprimer, par exemple
trigger_log, et de choisir loption Supprimer .
5 Conclusion
Dans ce chapitre, nous avons appris une notion trs importante : les dclencheurs. Nous avons
donc vu quil en existe deux types principaux, ceux du DML et ceux du DDL, qui comprennent aussi
les dclencheurs de connexion. Ils nous permettent dutiliser le principe de programmation
vnementielle, puisque nous utilisons un vnement pour activer notre dclencheur. Dans le
chapitre suivant, nous allons apprendre travailler avec des donnes de type XML, les extraire aussi
bien dun fichier plat que dune colonne dune table dans SQL Server.