Vous êtes sur la page 1sur 12

E:\BTS_SIO\SLAM3\TP\TP_SQLServer\4 - TP_PSDéclencheurs.

doc 1
__________________________________________________________________________________________

TP SQL Server2005 – Procédures stockées


et déclencheurs
 Objectifs:
- création et test de procédures stockées,
- création et test de déclencheurs sur votre base de données Gescom.

Condition de réalisation du TP: les tables de la base de données GESCOM doivent être créées
conformément au modèle relationnel ci-dessous et toutes les données insérées.

Un certain nombre de règles de gestion ont pu être mises en place lors de la création des tables,
d'autres nécessitent l'élaboration de procédures stockées et/ou déclencheurs.

Rappels sur la base de données GESCOM


Modèle relationnel :

CLIENTS (NoCli, Nom, Prénom, Adresse, CodePostal, Ville, Tel)


NoCli : clé primaire

CATEGORIES(CodeCat, LibelleCat)
CodeCat : clé primaire

ARTICLES(RefArt, DesignationArt, PrixHTArt, CodeCat)


RefArt : clé primaire
CodeCat : clé étrangère en référence à CodeCat de CATEGORIES

STOCKS(RefArt, Depot, QteStock, StockMini, StockMaxi))


RefArt, Depot : clé primaire
RefArt : clé étrangère en référence à RefArt de ARTICLES

COMMANDES (NoCde, DateCde, TauxRemise, NoCli, EtatCde)


NoCde : clé primaire
NoCli : clé étrangère en référence à NoCli de CLIENTS

LIGNESCOMMANDES(NoCde, NoLig, RefArt, QteCde)


NoCde, NoLig : clé primaire
NoCde : clé étrangère en référence à NoCde de COMMANDES
RefArt : clé étrangère en référence à RefArt de ARTICLES

HISTOFAC(NoFac, DateFac, NoCde, MontantHT, EtatFac)


NoFac : clé primaire
NoCde : clé étrangère en référence à NoCde de COMMANDES

Règles de gestion (à vérifier)

Table CLIENTS: le nom du client est obligatoire.

Table CATEGORIES: le code catégorie est un regroupement statistique interne codifié (valeurs
possibles 01 à 05)
E:\BTS_SIO\SLAM3\TP\TP_SQLServer\4 - TP_PSDéclencheurs.doc 2
__________________________________________________________________________________________

Table ARTICLES: la désignation est obligatoire.

Table STOCKS: l'entreprise dispose de plusieurs dépôts en France qui peuvent distribuer les
matériels. La quantité d'articles par dépôt doit pouvoir être gérée, ainsi que des valeurs limites de
quantités stockées.
Le stock mini doit être inférieur ou égal au stock maxi.
La quantité en stock doit être comprise entre -100000 et + 100000.

Table COMMANDES: on peut appliquer une remise globale (ne peut dépasser 5%) sur la
commande.
EtatCde ne peut prendre que les valeurs : EC (en cours), LP (livrée partiellement), LI (livrée), SO
(soldée).

Table LIGNESCOMMANDES: toutes les zones sont obligatoires

Table HISTOFAC: une commande dont toutes les factures sont réglées est considérée comme réglée.
EtatFac prend les valeurs : NR (non réglée), RP (réglée partiellement), RC (réglée complètement).

Le numéro de facture est incrémenté automatiquement de 1 en 1 à partir de 1.

PARTIE 1 : LES PROCEDURES STOCKEES

EXERCICE 1

Objectif: créer une procédure stockée (sans paramètres) qui permet d'afficher la liste des articles triés
sur la désignation avec référence article, désignation, prix HT, code catégorie et libellé catégorie.

Création et test d'une procédure stockée


1. Lancer l’outil MS SQL Server Management Studio de SQL Server 2005.

2. Dans la fenêtre Explorateur d’objets, sélectionnez la base de données GesCom,


Programmabilité, Procédures stockées, clic droit, Nouvelle procédure stockée

3. Compléter le code proposé :


- nom de la procédure : ListeArt
- paramètres éventuels
- instructions nécessaires

4. Exécutez le script. La procédure stockée est créée.

5. Testez la procédure stockée en lançant l’instruction : Exec ListeArt ou ListeArt

6. Si nécessaire, modifier la procédure stockée et testez à nouveau.


E:\BTS_SIO\SLAM3\TP\TP_SQLServer\4 - TP_PSDéclencheurs.doc 3
__________________________________________________________________________________________

EXERCICE 2

Objectif: créer une procédure stockée avec paramètre (code client), qui permet d'afficher les produits
commandés (date commande, référence article, désignation, quantité commandée) d'un client.

 Créer la procédure stockée : CommCli

 Tester la procédure avec l'instruction : CommCli 2

EXERCICE 3

Dans cet exercice vous allez mettre au point une procédure stockée, destinée au contrôle des
suppressions. Vous utiliserez les tables ARTICLES, STOCKS et LIGNESCOMMANDES pour
contrôler la validité d’une opération de suppression. En vous aidant de l'exemple donné en cours,
réalisez le code de la procédure stockée nommée SUPART, les objectifs suivants lui sont assignés :

1. contrôler que l'article est référencé dans la table ARTICLES,


2. contrôler que l'article n'existe plus en stock,
3. contrôler que l'article ne fasse pas l'objet d'une commande en cours ou livrée partiellement,
4. dans ces cas, la suppression de l'article est autorisée, sinon envoyer des messages d'erreurs
appropriés et ne pas réaliser la suppression

 Créer la procédure stockée SupArt, en vous inspirant de l'exemple du cours, saisissez le


code pour assurer les objectifs ci-dessus.

 Tester la procédure avec les valeurs suivantes, et noter les messages d'erreur
éventuels.

1. Execute SupArt 'AB03'

2. Execute SupArt 'AB21'

3. Execute SupArt 'IMPL'

4. Execute SupArt 'CVD7'

EXERCICE 4

Objectif: créer une procédure stockée qui permet de supprimer une commande et ses lignes de
commandes, après avoir contrôlé :
- que la commande existe,
- que la commande est bien soldée,
- que c’est une commande de l’année dernière
dans ces cas la suppression en cascade est autorisée, sinon envoyer des messages d'erreurs
appropriés et ne pas réaliser les suppressions
E:\BTS_SIO\SLAM3\TP\TP_SQLServer\4 - TP_PSDéclencheurs.doc 4
__________________________________________________________________________________________

 Créez la procédure SupCde

 Testez la procédure avec les différents cas. Pour cela ajoutez dans votre base de données
au moins une commande (état : soldé) et des lignes de commandes.

EXERCICE 5

Concevez une autre procédure stockée avec au moins un paramètre.

 Que réalisera cette procédure stockée?

 Rédigez le code la procédure:

 Créez et testez la procédure stockée.


E:\BTS_SIO\SLAM3\TP\TP_SQLServer\4 - TP_PSDéclencheurs.doc 5
__________________________________________________________________________________________

PARTIE 2 : LES DECLENCHEURS


EXERCICE 1

Dans cet exercice vous allez créer un déclencheur qui va créer automatiquement une facture (une
ligne dans la table HISTOFAC pour les colonnes : DateFac, NoCde, EtatFac) lors d'une insertion de
commandes (table COMMANDES )
Le champ MontantHt de la table HISTOFAC sera mis à jour par un autre déclencheur, lors de la
saisie de lignes dans la table LIGNESCOMMANDES.

Création d’un déclencheur

 Pour créer un déclencheur.

1. Dans la fenêtre Explorateur d’objets, sélectionnez la base de données GesCom, Tables,


sélectionnez la table dans laquelle vous allez créer le déclencheur (ici: COMMANDES),
Déclencheurs, clic droit, Nouveau déclencheur

2. En vous inspirant de l'exemple donné en cours, compléter le code proposé :


- nom du déclencheur: InsertFac
- instructions nécessaires

 Pour tester le déclencheur.

1. Pour cela lancer une requête d’insertion de commandes avec les données: commande n°12 du jour,
n° client 1, état commande = 'EC'

2. Contrôlez le contenu de la table HISTOFAC.

3. Insérez une autre commande et contrôlez de nouveau le contenu de HISTOFAC.

EXERCICE 2

Créez un déclencheur qui modifie le montant HT (initialisé à 0 par défaut) de la table HISTOFAC à
chaque insertion d'une ligne dans la table LIGNESCOMMANDES.

 Créez un déclencheur : MajHTFac

 Testez le déclencheur.

1. Pour cela lancer une requête d’insertion d'une ligne de commandes de la dernière commande créée
n°12.

2. Contrôlez la mise à jour du montant HT de cette commande dans la table HISTOFAC.

3. Insérez une deuxième ligne commande et contrôlez de nouveau le contenu de HISTOFAC.


E:\BTS_SIO\SLAM3\TP\TP_SQLServer\4 - TP_PSDéclencheurs.doc 6
__________________________________________________________________________________________

EXERCICE 3

Dans cet exercice vous allez créer un déclencheur qui sera activé lors des opérations d’insertion ou de
mise à jour sur la table CATEGORIES. Vous allez contrôler au moment de l’insertion ou de la mise à
jour que le libellé de la catégorie (ajouté ou modifié) n’existe pas déjà dans la table.

 Créer le déclencheur : MajCateg sur la table CATEGORIES avec le code Transact-SQL


suivant:

Create trigger MajCateg


on Categories
for Insert, Update
as
declare @LibCat varchar(30)
/* récupération du nom de la ligue dans la ligne insérée ou modifiée (table Inserted)*/
select @LibCat = LibelleCat from inserted
/* Test dans la table Categories, si au moins une ligne avec ce nom*/
if (select count(*) from Categories where LibelleCat = @LibCat) > 1

begin
print 'Ce libellé existe déjà avec un autre code catégorie!'
print 'L’’insertion ou la modification a été annulée'
/* Annulation de la mise à jour de la base */
rollback
end
else
begin
print 'L"insertion ou la modification a été réalisée avec succès'
end

 Tester le déclencheur :

1. En modifiant une ligne de la table CATEGORIES avec doublon sur le libellé, puis sans
doublon.

2. Pour pouvoir ajouter de nouvelles catégories dans la table CATEGORIES, il faut refaire la
règle "reg_CodeCat" qui n'autorise que les codes catégorie 1 à 5.
1. Sélectionner la règle "reg_CodeCat", Propriétés, supprimer la colonnes associée
"CodeCat" de la table CATEGOIRES et de la table ARTICLES.
2. Supprimer la règle.
3. Recréer cette règle en autorisant les codes 1 à 10.
4. Associer cette règle à la colonne CodeCat des tables CATEGORIES et
ARTICLES.

3. Tester le déclencheur en insérant une ligne dans la table CATEGORIES en utilisant un libellé
déjà existant, puis en donnant un libellé non utilisé.
E:\BTS_SIO\SLAM3\TP\TP_SQLServer\4 - TP_PSDéclencheurs.doc 7
__________________________________________________________________________________________

EXERCICE 4

1/ Créer un nouvelle table DEPOT (IdDepot, NomDepot, RueDepot, CpDepot, VilleDepot), les deux
premiers champs sont obligatoires.
2/ Créer un déclencheur qui, lors d’une insertion d’une ligne dans la table STOCK, contrôle
l’existence du dépôt dans la table DEPOT. S’il n’existe pas, créer la ligne DEPOT avec un libellé ‘à
compléter’.

 Créer le déclencheur : AjoutDepot

 Tester le déclencheur .

EXERCICE 5

Concevez un autre déclencheur.

 A quel moment s'exécutera ce déclencheur?

 Objet de ce déclencheur?

 Rédigez le code du déclencheur:

 Créez et testez le déclencheur.

EXERCICE 6

Créer le déclencheur qui n’autorise pas de doublons sur la désignation article lors d’une insertion ou
d’une modification de la colonne concernée dans la table ARTICLES.

 Créer le déclencheur

 Tester le déclencheur
E:\BTS_SIO\SLAM3\TP\TP_SQLServer\4 - TP_PSDéclencheurs.doc 8
__________________________________________________________________________________________

EXERCICE 7

Lors d’une insertion dans la table STOCKS ou d’une modification du stock minimum, celui-ci ne doit
pas être supérieur au stock maximum.

 Créer le déclencheur

 Tester le déclencheur

EXERCICE 8

Lors d’une nouvelle commande, la date de commande ne peut être en-dessous de 8 jours à la date du
jour(utiliser les fonctions sur date) et,

 Créer le déclencheur

 Tester le déclencheur

EXERCICE 9

Autoriser la suppression d’un client (et de tous ses objets) s’il n’a pas de commande, ou si les
commandes datent de plus de deux ans (utiliser les fonctions sur date).

 Créer le déclencheur

 Tester le déclencheur
E:\BTS_SIO\SLAM3\TP\TP_SQLServer\4 - TP_PSDéclencheurs.doc 9
__________________________________________________________________________________________

CORRIGE

PARTIE 1 : LES PROCEDURES STOCKEES


EXERCICE 1
Créer une procédure stockée qui permet d'afficher la liste des articles triés sur la désignation avec
référence article, désignation, prix HT, code catégorie et libellé catégorie.

Création :

Create procedure ListeArt


as
select RefArt, DesignationArt, PrixHTArt, Ar.CodeCat, LibelleCat
from Articles Ar, Categories Ca
where Ar.CodeCat = Ca.CodeCat
order by DesignationArt

Exécution : Exec ListeArt

EXERCICE 2
Créer une procédure stockée avec paramètre (code client), qui permet d'afficher les produits
commandés (date commande, référence article, désignation, quantité commandée) d'un client.

Création :

Create procedure CommCli (@Nocli int)


as
select DateCde, Ar.RefArt, DesignationArt, QteCde
from Articles Ar, Commandes Co, LignesCommandes Li
where Co.Nocli = @Nocli
and Co.NoCde = Li.NoCde
and Li.RefArt = Ar.RefArt

Exécution : Exec CommCli 2

EXERCICE 3
Dans cet exercice vous allez mettre au point une procédure stockée, destinée au contrôle des
suppressions. Vous utiliserez les tables ARTICLES, STOCKS et LIGNESCOMMANDES pour
contrôler la validité d’une opération de suppression. En vous aidant de l'exemple donné en cours,
réalisez le code de la procédure stockée nommée SUPART, les objectifs suivants lui sont assignés :
- contrôler que l'article est référencé dans la table ARTICLES,
- contrôler que l'article n'existe plus en stock
- contrôler que l'article ne fasse pas l'objet d'une commande en cours ou livrée partiellement
- dans ces cas la suppression de l'article est autorisée, sinon envoyer des messages d'erreurs
appropriés et ne pas réaliser la suppression
E:\BTS_SIO\SLAM3\TP\TP_SQLServer\4 - TP_PSDéclencheurs.doc 10
__________________________________________________________________________________________

Création :

Create procedure SuppArt (@RefArt char(4))


as if not exists (select * from Articles where RefArt= @RefArt)
begin
print 'Article inexistant'
return
end
if exists (select * from stocks where RefArt = @RefArt)
begin
print 'Cet article existe en stock'
return
end
if exists (select * from LignesCommandes Li, Commandes Co
where Li.RefArt = @RefArt
and Li.NoCde = Co.NoCde
and (EtatCde = ‘EC’ or EtatCde = ‘LP’))
begin
print 'Cet article est en commande en cours ou partiellement livrée'
return
end
delete from Articles where RefArt= @RefArt

Exécution :

SuppArt ‘AB03’  "Article inexistant"


SuppArt ‘AB21’  "Cet article existe en stock"
SuppArt ‘IMPL’"Cet article est en commande en cours ou partiellement livrée"
SuppArt ‘CVD7’  suppression réussie

EXERCICE 4

Créer une procédure stockée qui permet de supprimer une commande et ses lignes de commandes,
après avoir contrôlé :
- que la commande existe,
- que la commande est bien soldée,
- que c’est une commande de l’année dernière
dans ces cas la suppression en cascade est autorisée, sinon envoyer des messages d'erreurs
appropriés et ne pas réaliser les suppressions

Création :

Create procedure SuppCde (@nocde int)


as if not exists (select * from commandes where nocde= @nocde)
begin
print ‘Commande inexistante’
return
end
if not exists (select * from commandes where nocde = @nocde
and etatcde = ‘SO’)
begin
E:\BTS_SIO\SLAM3\TP\TP_SQLServer\4 - TP_PSDéclencheurs.doc 11
__________________________________________________________________________________________

print ‘commande non soldée’


return
end
if not exists (select * from commandes where nocde = @nocde
and year(datecde) = year(getdate())-1)
begin
print ‘ce n’’est pas une commande de l’’année dernière’
return
delete from lignescommandes where nocde = @nocde
print ‘lignes de commandes supprimées’
delete from commandes where nocde = @nocde
print ‘commande supprimée’

PARTIE 1 : LES DECLENCHEURS


EXERCICE 1

Dans cet exercice vous allez créer un déclencheur qui va créer automatiquement une facture (table
HISTOFAC) lors d'une insertion de commandes (table COMMANDES )

CREATE TRIGGER InsertFac


ON Commandes FOR INSERT
/* Quand il y a une insertion dans la table Commandes,
exécution des instructions suivantes */
AS
/* Déclaration variable locale */
declare @nocde int
/* Récupération du numéro commande dans la ligne Commandes
insérée dans la table INSERTED */
select @nocde = NoCde from inserted
/* insertion d'une ligne dans la table HISTOFAC avec la valeurs ci-après */
insert into HISTOFAC (NoCde, DateFac, EtatFac)
values (@nocde, getdate (), 'RC')

EXERCICE 2

Créez un déclencheur qui modifie le montant HT de la table HISTOFAC à chaque insertion d'une
ligne dans la table LIGNESCOMMANDES.

CREATE TRIGGER MajHTFac


ON LignesCommandes FOR INSERT
/* Quand il y a une insertion dans la table LigneCommandes,
exécution des instructions suivantes */
AS
/* Déclaration variablse locale s*/
declare @nocde int
declare @prixhtart float
declare @qtecde int
E:\BTS_SIO\SLAM3\TP\TP_SQLServer\4 - TP_PSDéclencheurs.doc 12
__________________________________________________________________________________________

/* Récupération de la qté commandée, du numéro de commande dans la ligne


LigneCommandes insérée dans la table INSERTED et du prix article dans la table Articles */
select @nocde = NoCde, @qtecde = QteCde, @prixhtart = PrixHtArt
from inserted I, Articles A
where I.RefArt = A.RefArt

/* mise à jour dans la table HISTOFAC du montant HT pour la commande concernée*/


update HISTOFAC
set MontantHt = MontantHT + (@prixhtart * @qtecde)
where NoCde = @nocde

EXERCICE 4

1/ Créer un nouvelle table DEPOT (IdDepot, NomDepot, RueDepot, CpDepot, VilleDepot), les deux
premiers champs sont obligatoires.
2/ Créer un déclencheur qui, lors d’une insertion d’une ligne dans la table STOCK, contrôle
l’existence du dépôt dans la table DEPOT. S’il n’existe pas, créer la ligne DEPOT avec un libellé ‘à
compléter’.

CREATE TRIGGER AjoutDepot


ON Stocks FOR INSERT
/* Quand il y a une insertion dans la table Stocks,
exécution des instructions suivantes */
AS
/* Déclaration variablse locale s*/
declare @depot char(2)
/* Récupération du depot de la ligne en cours d’insertion */
select @nodepot = depot from inserted
/* contrôle de l’existence du depot dans la table depot */
if not exists (select iddepot from depot)
begin
insert into depot (iddepot, nomdepot)
values (@depot, ‘à compéter’
print ‘nouveau dépôt enregistré, à compléter’
return
end

Vous aimerez peut-être aussi