Vous êtes sur la page 1sur 34

9.

Procédures stockées

• Une procédure stockée est un ensembles d’instructions Transact-SQL (T-


SQL) précompilées et stockées sous un nom et traitées comme une unité.

• Une PS est un objet de la base de données SqlServer qui effectue des tâches
souvent récurrentes.

• Une PS ne retourne pas de valeur explicitement.

• Deux types de procédures: système qui gèrent le SqlServer (sp_nameproc)


et utilisateur qui sont définies par l’utilisateur de la base de données.

NI © 2020-2021 SI-LST INFO 32


• Une procédure stockée, aussi appelée stored procedure en anglais, est un concept utilisé en
administration de base de données afin d’exécuter un ensemble d’instructions SQL. Une telle
procédure est stockée au sein du Système de Gestion de Base de Donneés (SGBD) et peut être
appelée à tout moment par son nom afin d’exécuter celle-ci.

• :
• Simplifier : un même code qui doit souvent être effectuée peut être enregistré afin d’être appelé
rapidement
• Amélioration des performances : les opérations peuvent être exécutées du côté du serveur de base de
données et envoyées directement prête à l’emploi par l’utilisateur qui va utiliser ces données. Par ailleurs,
cela va réduire les échanges entre le client et le serveur
• Sécurité : des applications peuvent avoir accès uniquement aux procédures stockées, sans avoir accès aux
données des tables directement, et/ou s’assurer que l’accès aux données soit toujours effectué de la même
manière

NI © 2020-2021 SI-LST INFO 33


a) Création d’une procédure stockée
• Procédure stockée sans paramètre d’entrées
create procedure nom_procedure

As

BLOC INSTRUCTIONS T-SQL

• Procédure stockée avec paramètre d’entrées


create procedure nom_procedure (liste_var_entrées type)

As

BLOC INSTRUCTIONS T-SQL

NI © 2020-2021 SI-LST INFO 34


• Procédure stockée avec paramètre d’entrées et de sorties
create procedure nom_procedure (liste_var_entrées type, liste_var_sorties type
output)

As

BLOC INSTRUCTIONS T-SQL

// le mot clé output signifie que ces variables seront utilisées comme
variables de retour

NI © 2020-2021 SI-LST INFO 35


b) Autres opérations sur les PS

• Modification
Alter procedure [bD].dbo.nom_procedure_à_modifier
As
[BLOC INSTRUCTIONS SQL]

• Suppression
drop procedure dbo.nom_procedure

• Exécution
Exec dbo.nom_procedure liste_paramètres

NI © 2020-2021 SI-LST INFO 36


Exemple• Créer une procédure qui liste les 10 premiers étudiants
create procedure PEtudiant1
as
select top 10 * from dbo.etudiant
go

 exec dbo.PEtudiant1


go

• Créer une procédure qui donne toutes les informations d’un étudiant donné
create procedure PEtudiant2(@codeCNE varchar(20))
as
select * from dbo.etudiant
where CNE = @codeCNE
go
 declare @x varchar(20)
set @x = ‘A1025’
exec DBName.dbo.PEtudiant2 @x 37

goNI © 2020-2021 SI-LST INFO


• Créer une procédure qui permet de récuperer l’âge d’un étudiant
create procedure PEtudiant3(@codeCNE varchar(20), @age int output)
as
select age from dbo.etudiant
where CNE = @codeCNE
go

 declare @x varchar(20), @age int


set @x = ‘A1025’
exec DBName.dbo.PEtudiant3 @x, @age output
print ‘l’’âge de l’étudiant ayant le code ‘ + @x + ‘est ‘ + convert(varchar(10), @age)
go

NI © 2020-2021 SI-LST INFO 38


10. Fonctions (UDF)

a) Création d’une fonction scalaire (qui retourne un type : numérique,


alphanumérique, …)

create function nom_fonction(paramètres d’entrée) returns type_paramètre _de_sortie


as
begin
corps-instructions_T-SQL
return (variable de sortie)
end
go

NI © 2020-2021 SI-LST INFO 39


b) Création d’une fonction table (qui retourne une table)

create function nom_fonction(paramètres d’entrée) returns table


as
return
corps-instructions_T-SQL
go

NI © 2020-2021 SI-LST INFO 40


Opérations sur les fonctions
a) Suppression :
drop function DBName.dbo.nom_fonction

b) Exécution:
• Si la fonction est de type scalaire, l’exécution est comme suit:
print DBName.dbo.nom_fonction(arguments)

• Si la fonction est de type table, l’exécution est comme suit:


select * from DBName.dbo.nom_fonction(arguments)

NI © 2020-2021 SI-LST INFO 41


Exemples
• Créer une fonction qui retourne le nom d’un étudiant donné (c’est une fonction
scalaire)

create function NomEtudiant(@c varchar(10)) returns varchar(10)


as
begin
declare @nom varchar(10)
set @nom = (select nom from DBName.dbo.Etudiant
where code = @c)
return @nom
end
go
 print DBName.dbo.NomEtudiant(‘A10258’)
Ou
declare @code varchar(10)
set @code = ‘A10258’
NI © 2020-2021 SI-LST INFO 42
print ‘le nom de l’’etudiant ayant le code :’ + @code + ‘est :’ + DBName.dbo.NomEtudiant(@code)
• Créer une fonction qui retourne la note d’un étudiant donné (c’est une fonction de
scalaire)

create function NoteEtudiant(@c varchar(10)) returns decimal


as
begin
declare @note decimal
select @note = note from DBName.dbo.Etudiant
where code = @c
return @note
end
go
 print DBName.dbo.NoteEtudiant(‘A10258’)
Ou
declare @code varchar(10)
set @code = ‘A10258’
print ‘la note de l’’etudiant ayant le code :’ + @code + ‘est :’ + convert(varchar(10),
DBName.dbo.NoteEtudiant(@code))
NI © 2020-2021 SI-LST INFO 43
• Créer une fonction qui retourne le nom, prénom et sa filière (c’est une fonction de
type table)
create function InfoEtudiant(@c varchar(10)) returns table
as
return
select nom, prenom, filiere from DBName.dbo.Etudiant
where code = @c
go

 select * DBName.dbo.InfoEtudiant(‘A10258’)


Ou
declare @code varchar(10)
set @code = ‘A10258’
select * DBName.dbo.InfoEtudiant(@code)

NI © 2020-2021 SI-LST INFO 44


11. Triggers

• Procédure stockée qui s’exécute automatiquement, de la forme « événement –


condition – action » (programmation événementielle)
 effectuer des manipulations automatiques sur la base de données ou ses
objets.
• Un trigger est déclenché par un événement spécifié par l’utilisateur (action):
création, insertion, mise à jour, suppression)
• Test de la condition pour exécuter le déclencheur : after, instead on.
• Pour une table, trois déclencheurs au maximum

NI © 2020-2021 SI-LST INFO 45


Types
déclencheurs

DDL DML

agit au niveau ---toutes les


agit au niveau ---toutes les
des tables de la opérations DML
d’une base de opérations DDL
base de données ---conditions:
données ou du --- condition:
ou ses vues after, instead of
serveur after
NI © 2020-2021 SI-LST INFO 46
Syntaxe
create trigger nom_trigger
on nom_table
[after/for/instead of ] {insert/delete/update}
as
begin
BLOC INSTRUCTIONS T-SQL ou action à faire
end
Opération qui
Ordre d’exécution du
déclenchera le
déclencheur
trigger

NI © 2020-2021 SI-LST INFO 47


Pour les opérations:

table ‘inserted’
insertion ==copie de la table où
on veut insérer

table ‘deleted’
==copie de la table où
Opération/action Suppression
on veut faire la
suppression

Modification
NI © 2020-2021 SI-LST INFO 48
Propriétés trigger

• After: : le déclencheur s’exécutera après l’action déclenchant le trigger


tables

• Instead of: le déclencheur s’exécutera au lieu de l’action déclenchant le trigger


 tables (sans contraintes d’intégrité), vues
 1 seul par action

NI © 2020-2021 SI-LST INFO 49


Ordre d’exécution:

• Cas du « after » (1) :


• S’il y a des contraintes, elles sont vérifiées dans un premier temps;

o Si elles sont validées, alors le trigger (bloc associé) est exécuté;

o Sinon, l’action est annulée sans exécution du trigger

• Exemple:

NI © 2020-2021 SI-LST INFO 50


NI © 2020-2021 SI-LST INFO 51
Ordre d’exécution:
• Cas du « after » (1’) :
• annulation

• Exemple:

NI © 2020-2021 SI-LST INFO 52


Ordre d’exécution:
• Cas du « instead of» (1) :
• Les enregistrements concernés par le trigger apparaissent que dans la table liée à l’action (inserted,
deleted)

• Si aucun code correspondant à l’action n’est inclus dans le corps du trigger, l’action ne sera pas
effectuée sans aucune annulation

• Exemple:

NI © 2020-2021 SI-LST INFO 53


NI © 2020-2021 SI-LST INFO 54
Ordre d’exécution:

• Cas du « instead of+ after » (1) :


• Le trigger ‘instead of’ est exécuté en premier lieu sans modification des tables originales;

• Après, exécution des triggers ‘after’ (tables temporaires contiennent nouvelles valeurs)

• Si d’autres instructions dans le trigger ‘instead of’ , elles seront exécutées à la fin des ‘after’ sauf en
cas d’annulation.

• Exemple:

NI © 2020-2021 SI-LST INFO 55


NI © 2020-2021 SI-LST INFO 56
 Create trigger update1
on ville  Create trigger update2
Instead of update on ville
as after update
begin as
select * from ville begin
select * from deleted select * from ville
raiserror(‘modification par instead of est select * from deleted
effectuée!!! ‘, 10, 15) raiserror(‘modification par after est
update from ville effectuée!!! ‘, 10, 15)
set cod_v in (select * from deleted) end
end go
go

NI © 2020-2021 SI-LST INFO 57


Trigger ‘INSERT’ :

 Le trigger est de type AFTER/FOR:

• On exécute l’ordre INSERT;


• La ligne est insérée dans la table choisie; //on table
• La ligne est journalisée dans la table INSERTED;
• Le corps T-SQL du trigger est exécuté;
• Jointure possible entre table choisie et table inserted.

NI © 2020-2021 SI-LST INFO 58


• Exemple:
create trigger T1 on produit
after insert
as
Begin
print ‘les produits ajoutés sont:’
Select * from inserted
end

 Ce trigger T1 se déclenchera après chaque ajout d’un ou plusieurs produits

NI © 2020-2021 SI-LST INFO 59


Trigger ‘DELETE’ :

 Le trigger est de type AFTER/FOR


• On exécute l’ordre DELETE
• La ligne est supprimée dans la table choisie.
• La ligne est journalisée dans la table DELETED on parle de : ANCIENNE LIGNE.
• Le corps T-SQL du trigger est exécuté
• Jointure possible entre la table choisie et la table DELETED
• Le Rollback consiste à rétablir la ligne supprimée  pas de réelle modification

NI © 2020-2021 SI-LST INFO 60


• Exemple:
create trigger T2 on produit
for delete
as
Begin
print ‘les produits supprimés sont:’
Select * from deleted
end

 Ce trigger T2 se déclenchera lors de chaque suppression d’un ou plusieurs


produits

NI © 2020-2021 SI-LST INFO 61


Trigger ‘UPDATE’
• On exécute l’ordre UPDATE
• La ligne est journalisée dans la table DELETED (Ancien) et INSERTED (Nouveau).
• Le trigger est exécuté;

NI © 2020-2021 SI-LST INFO 62


• Exemple:
create trigger T3 on produit
for update
as
Begin
Select * from produit
print ‘les produits mis à jour sont:’
Select * from deleted
end

 Ce trigger T3 se déclenchera lors de chaque mise à jour du (des) produit(s)


concerné(s)
NI © 2020-2021 SI-LST INFO 63
Validation de l’action

Procédure pour
action: insert,  Le commit valide l’action qui déclenchera le
delete, update
trigger : insert, update, delete + exécutera le
code T-SQL associé au trigger créé.

Validation Annulation  Le rollback annule toute l’action et n’exécute


que le corps T-SQL associé au trigger créé.

commit Rollback

NI © 2020-2021 SI-LST INFO 64


Contrôle de flux

• La fonction print n’est pas la seule à avoir la possibilité d’afficher des messages; nous
avons aussi la fonction return(expression) , raiserror(expression),
formatmessage(expression).
• Ces fonctions permettent des possibilités plus que le print mais avec des conditions
comme illustré avec les exemples suivant:

NI © 2020-2021 SI-LST INFO 65

Vous aimerez peut-être aussi