Vous êtes sur la page 1sur 16

Les dclencheurs

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

Dotnet France Association CASANOVA Grgory


3 Les dclencheurs [09/07/09]

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.

Dotnet France Association CASANOVA Grgory


4 Les dclencheurs [09/07/09]

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).

Dotnet France Association CASANOVA Grgory


5 Les dclencheurs [09/07/09]

3 Les dclencheurs du DML

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.

3.2 Cration dun dclencheur du DML


La cration de ce genre dobjet de la base ne peut se faire que par du code T-SQL, en revanche,
il est possible, comme pour tout autre objet de la base dauto gnrer le modle de cration dune
dclencheur. Pour ce faire, tendez les nuds de lexplorateur dobjet jusqu' la table pour laquelle
vous voulez crer le dclencheur, puis tendez la table choisie comme suit :

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 :

Dotnet France Association CASANOVA Grgory


6 Les dclencheurs [09/07/09]

-- ================================================
-- 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;

-- Insert statements for trigger here

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.

Dotnet France Association CASANOVA Grgory


7 Les dclencheurs [09/07/09]

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.

CREATE TRIGGER Soustraction_Stock


ON Commande
AFTER INSERT
AS
BEGIN
DECLARE @Id_Stock int, @Quantite int
SELECT @Id_Stock = Id_stock FROM INSERTED
SELECT @Quantite = Quantite FROM INSERTED
UPDATE [Stock]
SET [Quantite] = [Quantite]-@Quantite
WHERE Id_Stock = @Id_Stock
END

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 :

Dotnet France Association CASANOVA Grgory


8 Les dclencheurs [09/07/09]

3.3 Suppression dun dclencheur du DML


Comme pour tout objet de la base, le dclencheur peut tre supprim de deux manires, par
code T-SQL ou encore par linterface graphique. Voyons les deux manires.

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 :

DROP TRIGGER Soustraction_Stock

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 :

Dotnet France Association CASANOVA Grgory


9 Les dclencheurs [09/07/09]

Effectuez alors un clic droit sur le dclencheur et slectionnez loption supprimer .

Dotnet France Association CASANOVA Grgory


10 Les dclencheurs [09/07/09]

4 Les dclencheurs du DDL

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.

4.2 Cration dun dclencheur du DDL


Prsentons maintenant la structure gnrale de cration dun dclencheur de type DDL :

USE Entreprise
GO

CREATE TRIGGER nom_trigger


ON DATABASE
FOR CREATE_TABLE
AS
BEGIN
ROLLBACK TRAN
END

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.):

Les instructions sur une base de donnes :

- Tables :

DDL_TABLE_EVENTS
CREATE TABLE
ALTER_TABLE
DROP_TABLE

- Vues :

Dotnet France Association CASANOVA Grgory


11 Les dclencheurs [09/07/09]

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

Dotnet France Association CASANOVA Grgory


12 Les dclencheurs [09/07/09]

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

- Droits sur la base de donnes :


GRANT_DATABASE
DENY_DATABASE
REVOKE_DATABASE

- 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

Les instructions sur le serveur :


- Logins :

CREATE_LOGIN
ALTER_LOGIN
DROP_LOGIN

Dotnet France Association CASANOVA Grgory


13 Les dclencheurs [09/07/09]

- Endpoints :

CREATE_HTTP_ENDPOINT
DROP_HTTP_ENDPOINT

- Droits daccs au serveur :

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.

Voyons maintenant ce que signifient les options disponibles :


- WITH ENCRYPTION : Permet de crypter le code du dclencheur dans la base de donnes
MASTER.

Prenons un exemple concret de cration dun dclencheur du DDL.

USE Entreprise
GO

CREATE TABLE log_database


(date_log datetime2, nom_user nvarchar(50), Instruction nvarchar(100))
GO

CREATE TRIGGER trigger_log


ON DATABASE
AFTER DDL_TABLE_EVENTS
AS
BEGIN
INSERT INTO log_database
(date_log, nom_user, Instruction)
VALUES
(GETDATE(),
CURRENT_USER,
EVENTDATA().value('(/EVENT_INSTANCE/EventType)
[1]','nvarchar(50)'))
END

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 :

Dotnet France Association CASANOVA Grgory


14 Les dclencheurs [09/07/09]

SELECT * FROM dbo.log_database

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 :

CREATE TRIGGER trigger_log


ON ALL SERVER
FOR LOGON
AS
BEGIN
--instructions
END

Il faut faire trs attention avec les dclencheurs de connexions, car dans certains cas, ils peuvent
vous empcher une connexion au serveur.

4.3 Suppression dun dclencheur du DDL


Comme toujours, il est possible de supprimer un objet de la base de donnes de deux manires, nous
allons montrer les deux.

- Par code T-SQL :

La syntaxe de suppression dun dclencheur est simple. Elle est la suivante :

DROP TRIGGER trigger_log ON DATABASE

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.

- Par linterface graphique :

Il vous suffit dans un premier temps de dployer les nuds de lexplorateur dobjet de SSMS, jusqu
votre dclencheur de cette manire :

Dotnet France Association CASANOVA Grgory


15 Les dclencheurs [09/07/09]

Il vous suffit alors simplement de faire un clic droit sur le dclencheur supprimer, par exemple
trigger_log, et de choisir loption Supprimer .

Dotnet France Association CASANOVA Grgory


16 Les dclencheurs [09/07/09]

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.

Dotnet France Association CASANOVA Grgory