Vous êtes sur la page 1sur 57

BASES DE DONNEES AVANCEES

CHAPITRE:I
langage Description de
Données
Pr. OUBEDDA LATIFA Année Universitaire
2017/2018
18/10/2022
1. SQL server

SQL-Server est un SGBDR Client-Serveur qui utilise TRANSACT- SQL dans ses transactions.

Les bases de données contiennent un certain nombre d’objets logiques.


Il est possible de regrouper ces objets en trois grandes catégories:
• Gestion et stockage des données : tables, type de données, contraintes d’intégrité, valeur par défaut, règles et
index.
• Accès aux données : vues et procédures stockées.
• Gestion de l’intégrité complexe: déclencheur (Trigger)
18/10/2022
2 Création d’une base de données

La création d’une base de données est une étape ponctuelle, réalisée par un administrateur SQL Server.

Avant de créer une base de données, il est important de définir un certain nombre d’éléments de façon précise :

• Le nom de la base de données qui doit être unique sur le serveur SQL,

• La taille de la base de données,

• Les fichiers utilisés pour le stockage des données.

Une base peut être créée de deux façons différentes :

• Par l’intermédiaire de l’instruction Transact SQL CREATE DATABASE;

• Par l’intermédiaire de SQL Server Management Studio


18/10/2022
Syntaxe :

CREATE DATABASE nom_bd

ON (

NAME = nom logique de fichier,

FILENAME = chemin de fichier .mdf,

SIZE = taille en MB , MAXSIZE = taille en MB ,

FILEGROWTH = pas d’ incrément en MB ou % )

LOG ON (

NAME = nom logique de fichier log,

FILENAME = chemin de fichier log .ldf,

SIZE = taille en MB , MAXSIZE = taille en MB ,

FILEGROWTH = pas d’ incrément en MB ou % ) 18/10/2022


Exemple:

Créer une base de données nommée « BD-inscription".

Cette base aura les caractéristiques suivantes:

Un fichier de données:

• taille initiale: 3 Mo

• croissance du fichier: 20 %

• taille maximale: 10 Mo

Un fichier "Journal":

• taille initiale: 1 Mo

• croissance du fichier: 10%

• taille maximale: illimité

18/10/2022
Solution

• CREATE DATABASE BD-inscription

• ON ( NAME = 'inscription_Data',

• FILENAME = 'C :\inscription_Data.mdf' ,

• SIZE = 3MB ,

• MAXSIZE = 10MB ,

• FILEGROWTH = 20%)

• LOG ON ( NAME = 'inscription_log',

• FILENAME = 'C:\inscription_log.ldf' ,

• SIZE = 1MB ,

• MAXSIZE = UNLIMITED,

• FILEGROWTH = 10%);
18/10/2022
3. les tables , View

3.1 création des tables:


Syntaxe :
CREATE TABLE nom_table ( champ type , ....)
Exemple :
Créer les tables suivantes :
Etudiant( code , nom , prenom , date_naiss , note, numCla)
Classe (numCla, libelle )

Solution :

CREATE TABLE Etudiant( code int, nom varchar(10) , prenom varchar(20) , date_naiss date ,
note decimal(4,2) , numCla int)
CREATE TABLE Classe (numCla int, libelle varchar(10))

18/10/2022
3.2 les contraintes d’intégrités

• Contraintes de clé primaire :

Syntaxe :
ALTER TABLE nom_table
ADD CONSTRAINT nom_contrainte PRIMARY KEY (nom_champ);

Exemple :
Le champ code de la table Etudiant

Solution:
ALTER TABLE Etudiant
ADD CONSTRAINT pk_code PRIMARY KEY (code);

18/10/2022
Contraintes de clés étrangères :

Syntaxe :
ALTER TABLE nom_table
ADD CONSTRAINT nom_contrainte FOREIGN KEY (nom_champ)
REFERENCES nom_table(champ);

Exemple :
Le champ numCla de la table etudiant

Solution:
ALTER TABLE Etudiant
ADD CONSTRAINT fk_numClasse FOREIGN KEY (numCla) REFERENCES
Classe ( numCla);

18/10/2022
Contraintes de validation

Les contraintes de validations (CHECK) vont permettre de définir un certain nombre de règles simples de gestion des données.
Syntaxe :
ALTER TABLE nom_table
ADD CONSTRAINT nom_contrainte
CHECK ( règles);
Exemple :
Définir la règle suivante :
La note de l’étudiant doit être compris entre 0 et 20

Solution:
ALTER TABLE etudiant
ADD CONSTRAINT contrainte_note
CHECK ( note between 0 and 20 );

18/10/2022
Les index
Les index vont permettre d’accéder plus rapidement aux différentes informations.
Syntaxe :
CREATE INDEX nom_index ON nom_table(nom_champ);
Exemple :
Définir un index pour le champ numCla de la table Etudiant

Solution:
CREATE INDEX ix_numCla ON Etudiant ( numCla);

18/10/2022
Exercice :

Dans MS SQL server :

• Créer la base de données bd1

• Créer les 3 tables suivantes avec toutes les contraintes possibles

etudiant ( NumEtdINT , nom varchar (10), prenom varchar (10),adresse varchar (12),ville varchar (10))

Matiere ( NumMat INT , libelle varchar (10))

Notation ( Num Etd INT, NumMat INT, note decimal (4,2), dateEvaluer DateTime)

18/10/2022
Solution

Create Database bd_scolarite3

Create table etudiant ( NumEtd INT primary Key , nom varchar (10), prenom Varchar (10),adresse varchar (9),ville

Varchar (10))

Create table matiere ( NumMat INT primary Key, libelle varchar(10))

Create table notation (NumEtd INT, NumMat INT, note decimal(2,2),dateEvaluer Datetime, Constraint

pk_NumEtd_NumMat primary Key( NumEtd, NumMat),

Constraint fk_NumEtd foreign key (NumEtd) references etudiant ( NumEtd),

Constraint fk_NumMat foreign key(NumMat) references matiere ( NumMat))

Pr. OUBEDDA LATIFA Année Universitaire


2017/2018
18/10/2022
Manipulation de données

Modification de la table

Types de données définis par l’utilisateur

Il est possible de définir ses propres types de données, soit par l’intermédiaire de Management Studio, soit par la commande CREATE TYPE.

Syntaxe :

CREATE TYPE nom_type FROM type_base { null / not null}


Avec ALTER on peut modifier les colonnes d’une table ou ajouter de nouvelles colonnes par syntaxe:
ALTER TABLE NomTable
ADD NomColonne TypeDonnees

Exemple :

Définir un type de données utilisateur nommé texte de type nvarchar (20) non null et attribuer ce type aux champs nom de la table etudiant?

Solution:

CREATE TYPE texte FROM nvarchar (20) not null

ALTER TABLE Etudiant ALTER COLUMN nom texte


18/10/2022
Les schémas

Un schéma est ensemble logique d’objets à l’intérieur d’une base de données à la manière de bibliothèque package ou des espaces de noms.

Par exemple :

dbo.Etudiant signifier que l’objet table etudiant est liée au schéma dbo.

Syntaxe :

CREATE SCHEMA mon_Schema

Exemple :

Créer le schéma ecole. Puis, Ajouter à ce schéma la table professeur ( code , nom )

Solution:

CREATE SCHEMA ecole

CREATE TABLE ecole.professeur ( code int, nom varchar(8))

18/10/2022
Séquence
Une séquence est un objet lié au schéma défini par l'utilisateur qui génère une séquence de valeurs numériques (exemple : 12,14,16,18,20,...)
Syntaxe :
Création d’une séquence
CREATE SEQUENCE schema_name. sequence_name AS integer_type
START WITH <constant>
INCREMENT BY <constant>
MINVALUE <constant> | NO MINVALUE
MAXVALUE < constant> | NO MAXVALUE
CYCLE | NO CYCLE
Utilisation d’une séquence
l’instruction: NEXT VALUE FOR schema_name. Sequence_name permet d’obtenir le numéro séquentiel suivant.
On peut attribuer une séquence à un champ en utilisant la contrainte default :
ALTER TABLE nom_table
ADD CONSTRAINT nom_defaut DEFAULT valeur FOR nom_champ

18/10/2022
Exemple:

Créer la séquence seq qui permet de générer une séquence de valeurs numériques (10,12,14,16,...).

Puis, attribuer la séquence seq au champ code de la table professeur

Solution :

1. CREATE SEQUENCE ecole.seq AS int

START WITH 10

INCREMENT BY 2

2. ALTER TABLE ecole.professeur

ADD CONSTRAINT def DEFAULT NEXT VALUE FOR ecole.seq FOR code

18/10/2022
3.3 View

Une vue est une table virtuelle, dans laquelle il est possible de rassembler des informations provenant de plusieurs tables.
les données ne sont pas stockées dans une table de la base de données.
Syntaxe :

CREATE VIEW Nom_de_la_Vue (colonnes) AS SELECT


...
Exemple:

1. Créer la view v1 qui permet de visualiser les noms et prénoms des étudiants ainsi que ses notes?
2. Afficher les informations de la view v1?

Solution :

1. CREATE VIEW v1 AS SELECT nom,prenom,note FROM etudiant e,notation n


WHERE e.numetd = n.numetd
2. SELECT * FROM v1

18/10/2022
l'Optimiseur de requête SQL

Objectifs

 Indication des étapes de traitement d'une requête.

 Distinction entre les arguments de recherche et les arguments hors recherche.

 Description de la procédure de calcul du coût d'une requête par l'Optimiseur de requête.

 Description des méthodes de traitement des jointures.

ATTENTION : vérifiez bien que la transformation opère une réduction du temps de traitement

Pr. OUBEDDA LATIFA Année Universitaire


2017/2018
18/10/2022
ÉVITEZ PRÉFÉREZ
évitez d'employer l'étoile dans la clause ...préférez nommer les colonnes une à une
SELECT...
Sélectionnez

Sélectionnez
SELECT CLI_ID, TIT_CODE, CLI_NOM,
SELECT * CLI_PRENOM, CLI_ENSEIGNE
FROM T_CLIENT FROM T_CLIENT

n'employez pas de colonne dans la clause


SELECT... ...utilisez l'étoile ou une constante
de la sous requête EXISTS...
Sélectionnez
Sélectionnez
SELECT CHB_ID
SELECT CHB_ID FROM T_CHAMBRE T1
FROM T_CHAMBRE T1 WHERE NOT EXISTS (SELECT *
WHERE NOT EXISTS (SELECT CHB_ID FROM TJ_CHB_PLN_CLI T2
FROM TJ_CHB_PLN_CLI T2 WHERE PLN_JOUR = '2000-11-11'
WHERE PLN_JOUR = '2000-11-11' AND T2.CHB_ID = T1.CHB_ID)
AND T2.CHB_ID = T1.CHB_ID)

Pr. OUBEDDA LATIFA


18/10/2022
évitez de compter une colonne... ...quand-il suffit de compter les lignes

Sélectionnez Sélectionnez

SELECT COUNT (CHB_ID) SELECT COUNT (*)


FROM T_CHAMBRE FROM T_CHAMBRE
évitez les fourchettes < et > pour des valeurs discrètes... ...préférez le BETWEEN

Sélectionnez Sélectionnez

SELECT * SELECT *
FROM T_FACTURE FROM T_FACTURE
WHERE FAC_DATE > '2000-06-18' WHERE FAC_DATE BETWEEN '2000-06-18'
AND FAC_DATE < '2000-07-15' AND '2000-07-14'

évitez d'employer le DISTINCT... ...si une sous requête EXISTS vous offre le dé doublonnage
Sélectionnez
Sélectionnez
SELECT CLI_NOM, CLI_PRENOM
SELECT DISTINCT CLI_NOM, CLI_PRENOM
FROM T_CLIENT C
FROM T_CLIENT C
WHERE EXISTS (SELECT *
JOIN TJ_CHB_PLN_CLI J
FROM TJ_CHB_PLN_CLI J
ON C.CLI_ID = J.CLI_ID
WHERE C.CLI_ID = J.CLI_ID
WHERE PLN_JOUR = '2000-11-11'
AND PLN_JOUR = '2000-11-11')

Pr. OUBEDDA LATIFA Année Universitaire


2017/2018
18/10/2022
Chapitre: II

Transact SQL et la programmation des


serveurs de bases de données
relationnelles.

18/10/2022
1. Introduction

La programmation des transactions au sein de programmes compilés et stockés sur

le serveur SGBDR apporte de la rigueur à vos développements et facilite la maintenance

à venir de vos applicatifs.

18/10/2022
Pour les exemples de ce cours, la base de données SQL Server GestionCom qui sera utilisée est comme suivante :

I- NOTIONS EN TRANSACT SQL

I.1 La déclaration d’une variable


Syntaxe : Declare @Nom_Variable Type_Donnée

Exemples :
Declare @a int
Declare @b varchar(10)

18/10/2022
I.2 l’affectation d’une valeur à une variable
Syntaxe : Select @Nom_Variable = valeur
Select @Nom_Variable = (Select ...from...Where)

Ou
Set @Nom_Variable =valeur
Set @Nom_Variable = (Select ...from...Where)

Exemples :
Set @a=1

-- Affecte la valeur 1 à la variable @a

Set @a=(Select count(NumArt) from Article)

-- Affecte le nombre d'articles enregistrés dans la table article à la variable @a

Set @b='commande'

-- Affecte la valeur 'commande' à la variable @b

18/10/2022
I.3 affichage d’informations

Syntaxe : Print Elément_A_Afficher

Exemples :

Soient @a et @b des variables de type Chaîne de caractères, @c et @d des variables de type entier

Print 'Bonjour' -- Affiche le texte Bonjour

Print @a -- Affiche la valeur de @a

Print @c -- Affiche la valeur de @c

Print @c + @d -- Affiche la somme des variables @c et @d

Print convert(varchar, @c) + @b -- Affiche la valeur de @c concaténé avec la valeur de @b mais


puisque @c est de type numérique et qu'on ne peut jamais concaténer une valeur numérique avec une valeur chaîne
de caractères, il faut passer par une fonction de conversion dont la syntaxe est la suivante : Convert (Type de
conversion, Valeur à convertir).

18/10/2022
I.4 les structures alternatives
If...Else

Syntaxe :
If Condition
Begin
Instructions
End
Else
Begin
Instructions
End

Exercice : On souhaite vérifier si le stock de l'article portant le numéro 10 a atteint son seuil minimum. Si c'est le cas afficher le
message 'Rupture de stock' :

18/10/2022
Declare @QS

Declare @SM int

Select @QS = (Select QteEnStock from article Where NumArt =10)

Select @SM = (Select SeuilMinimum from article Where NumArt =10)

If @QS<=@SM Print 'Rupture de stock'

Else

Print 'Stock Disponible'

18/10/2022
I.5 l’instruction case

Case : Permet d'affecter, selon une condition, une valeur à un champ dans une requête Select

Syntaxe :
Case
When Condition1 Then Résultat 1
When Condition2 Then Résultat 2
...
Else Résultat N
End

Exercice :

Afficher la liste des articles (Numéro, Désignation et prix) avec en plus une colonne Observation qui affiche

'Non Disponible' si la quantité en stock est égale à 0, 'Disponible' si la quantité en stock est supérieure au stock

Minimum et 'à Commander' sinon.

18/10/2022
Select NumArt, DesArt, PUArt, 'Observation' =
Case
When QteEnStock=0 then 'Non Disponible'

When QteEnStock>SeuilMinimum then 'Disponible'

Else 'à Commander'


End
From Article

Exemple :

Tant que la moyenne des prix des articles n'a pas encore atteint 20 DH et le prix le plus élevé pour un article n'a pas encore atteint

30 DH, augmenter les prix de 10% et afficher après chaque modification effectuée la liste des articles. Une fois toutes les

modifications effectuées, afficher la moyenne des prix et le prix le plus élevé :

18/10/2022
While ((Select avg(puart) from article)<20) and (select max(puart) from article) <30)
Begin Update article Set puart=puart+(puart*10)/100
Select * from article
End
Select avg(puart) as moyenne , max(puart) as [Prix élevé] from article

18/10/2022
I.6 Le test de modification d’une colonne
L'instruction If Update renvoie une valeur true ou false pour déterminer si une colonne spécifique d'une table a été
modifié par une instruction insert ou update (cette instruction est utilisée spécialement dans les déclencheurs et ne
s'applique pas à une instruction Delete).

Syntaxe :
If Update (Nom_Colonne)
Begin

End

I.7 le branchement
L'instruction Goto renvoie l'exécution du programme vers un point spécifique repéré par une étiquette

Syntaxe :
Goto Etiquette

18/10/2022
I.8 Exercices : 1. Ecrire un programme qui calcule le montant de la commande numéro 10 et affiche un message 'Commande
Normale' ou 'Commande Spéciale' selon que le montant est inférieur ou supérieur à 100000 DH

2.. Ecrire un programme qui supprime l'article numéro 8 de la commande numéro 5 et met à jour le stock. Si après la suppression

de cet article, la commande numéro 5 n'a plus d'articles associés, la supprimer.

3.. Ecrire un programme qui affiche la liste des commandes et indique pour chaque commande dans une colonne Type s'il s'agit

d'une commande normale (montant <=100000 DH) ou d'une commande spéciale (montant > 100000 DH)

4.. A supposer que toutes les commandes ont des montants différents, écrire un programme qui stocke dans une nouvelle table

temporaire les 5 meilleures commandes (ayant le montant le plus élevé) classées par montant décroissant (la table à créer aura la

structure suivante : NumCom, DatCom, MontantCom)

5.. Ecrire un programme qui :

Recherche le numéro de commande le plus élevé dans la table commande et l'incrémente de 1

Enregistre une commande avec ce numéro

Pour chaque article dont la quantité en stock est inférieure ou égale au seuil minimum enregistre une ligne de commande avec le

numéro calculé et une quantité commandée égale au triple du seuil minimum .

18/10/2022
1.Declare @Montant decimal
Solution :
Set @Montant=(Select Sum(PUArt*QteCommandee) from Commande C, Article A,
LigneCommande LC where C.NumCom=LC.NumCom and LC.NumArt=A.NumArt and C.NumCom=10)

If @Montant is null
Begin
Print 'Cette Commande n''existe pas ou elle n''a pas d''ingrédients' Return
End
if @Montant <=10000 Print 'Commande Normale'
Else
Print 'Commande Spéciale'
2. Declare @Qte decimal

Set @Qte=(select QteCommandee from LigneCommande where NumCom=5 and NumArt=8)


Delete from LigneCommande where NumCom=5 and NumArt=8
Update article set QteEnStock=QteEnStock+@Qte where NumArt=8
if not exists (select numcom from LigneCommande where NumCom=5)
Delete from commande where NumCom=5

18/10/2022
3. Select C.NumCom, DatCom, Sum(PUArt*QteCommandee), 'Type'=
Case
When Sum(PUArt*QteCommandee) <=10000 then 'Commande Normale'
Else 'Commande Spéciale'
End
From Commande C, Article A, LigneCommande LC Where C.NumCom=LC.NumCom and , LC.NumArt=A.NumArt
Group by C.NumCom, DatCom

4. Create Table T1 (NumCom int, DatCom DateTime, MontantCom decimal)


Insert into T1 Select Top ( C.NumCom, DatCom, Sum(PUArt*QteCommandee) as Mt
From Commande C, Article A, LigneCommande LC Where C.NumCom=LC.NumCom and ,LC.NumArt=A.NumArt
Group by C.NumCom, DatCom
Order by Mt Desc

5. if exists(select NumArt from article where QteEnStock<=SeuilMinimum)


Begin
Declare @a int
set @a=(select max(NumCom) from commande) + 1
insert into commande values(@a, getdate())
insert into lignecommande Select @a, NumArt, SeuilMinimum * 3
From article Where QteEnStock <=SeuilMinimum
End

18/10/2022
I.9 Les transactions

Une transaction est un groupe d'Operations tel que :

 Soit toutes les opérations sont exécutées

 Soit aucune ne l'est

Une transaction débute par l'instruction BEGIN, elle se termine:

 Soit par COMMIT : toutes les opérations sont exécutées et enregistrées

 Soit par ROLLBACK : toutes les opérations sont annulées (défaites) et on retrouve l‘état initial.

Syntaxe :
Begin Tran [Nom_Transaction]

If Condition
RollBack Tran [Nom_Transaction]
Ou
Commit Tran [Nom_Transaction]

18/10/2022
II- les curseurs

II.1 définition
Les curseurs permettent de récupérer les lignes une par une. chose qui n'est pas possible avec une
requête SQL simple.

Syntaxe

1. déclarer un curseur
Declare nom_curseur Cursor Static/ Keyset/ Dynamic For Select …

*Curseurs statiques (Static) , *Curseurs d'ensemble de valeurs clés (Keyset) , *Curseurs dynamiques (Dynamic)

2. ouvrir un curseur
Open nom_curseur

18/10/2022
3. lire un enregistrement à partir d'un curseur
Atteindre le premier enregistrement du curseur

Fetch First from nom_curseur into variable1, variable2,..


Atteindre l'enregistrement du curseur suivant celui en cours

Fetch Next from nom_curseur into variable1, variable2,... Ou Fetch nom_curseur into variable1, variable2…
Atteindre l'enregistrement du curseur précédent celui en cours

Fetch Prior from nom_curseur into variable1, variable2,...


Atteindre le dernier enregistrement du curseur

Fetch Last from nom_curseur into variable1, variable2,...


Atteindre l'enregistrement se trouvant à la position n dans le curseur

Fetch absolute n from nom_curseur into variable1, variable2,...


Atteindre l'enregistrement se trouvant après n positions de la ligne en cours

Fetch Relative Num_Ligne from nom_curseur into variable1, variable2,...

4. Fermer un curseur
Close nom_curseur

5. Libérer les ressources utilisées par un curseur :


Deallocate Nom_Curseur
18/10/2022
Remarque : La variable système @@fetch_status est utilisée pour détecter la fin du curseur. Tant que cette variable a la valeur 0,
on a pas encore atteint la fin du curseur.

Exemple
L'exemple suivant déclare un curseur simple pour les lignes de la table Person. Person dont le nom commence par B, et il utilise
FETCH NEXT pour parcourir les lignes. L'instruction FETCH renvoie la valeur de la colonne spécifiée dans DECLARE CURSOR
comme un jeu de résultats sur une seule ligne.

DECLARE contact_cursor CURSOR FOR


SELECT LastName FROM Person
WHERE LastName LIKE 'B%'
ORDER BY LastName;
OPEN contact_cursor;
FETCH NEXT FROM contact_cursor;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM contact_cursor;
END DEALLOCATE contact_cursor;
18/10/2022
III. La procédure stockée :

Une procédure stockée est une collection précompilée d'instructions Transact-SQL stockée sous un nom et traitée comme

une unité. Les procédures stockées de SQL Server permettent de gérer celui-ci et d'afficher les informations sur les bases

de données et les utilisateurs.

Elles renvoient les données avec :


1. Sans paramètres :

La procédure stockée exécute un traitement donné mais ce traitement ne dépend d'aucune valeur provenant de l'application

appelante.

Syntaxe :

Create Procedure Nom_Procédure as Instructions

Exécution :

Exec Nom_Procedure

18/10/2022
2 Avec des paramètres en entrée :

La procédure stockée en fonction de valeurs provenant de l'extérieur va effectuer certains traitements.

Syntaxe :

Create Procedure Nom_Propriétaire.Nom_Procedure Nom_Param1_Entrée Type_Donnée =

Valeur_Par_Defaut, Nom_Param2_Entrée Type_Donnée = Valeur_Par_Defaut… as Instructions

Exécution :

Exec Nom_Procedure Valeur_Param1, Valeur_Param2...

Ou Exec Nom_Procedure Nom_Param1 = Valeur_Param1, Nom_Param2 = Valeur_Param2...

18/10/2022
3 Avec des paramètres en sortie : La procédure stockée suite à un traitement réalisé va attribuer des valeurs à des
paramètres en sortie. Les valeurs de ces paramètres peuvent être récupérées par des applications clientes.
Soit l’exemple suivant:
create procedure ps_Test2 (@IDUtilisateur char(20), @MotPasseUtilisateur varchar(20) output)
as
if exists(SELECT * from Utilisateurs
where IDUtilisateur= @IDUtilisateur)
BEGIN
SELECT @MotPasseUtilisateur=MotPasseUtilisateur from Utilisateurs
where IDUtilisateur= @IDUtilisateur
return 1
END
else return 0
Exécution de la procédure
DECLARE @ret int, @mot varchar(50)
Execute @ret=ps_test2 ,@mot output
Print @ret
Print @mot
18/10/2022
1.4. Suppression d’une procédure stockée

Syntaxe :

Drop Procedure Nom_Procédure

1.5. Modification d’une procédure stockée

Syntaxe :

Alter Procedure Nom_Procédure as

Nouvelles instructions

18/10/2022
Devoirs N*1 :

Créer une procédure stockés démo_ligne_commande: pour objectif remplir la table ligne_commande de jeux
enregistrement a partir des données des deux tables article et commande: la table a remplir doit contenir
toutes les commandes existantes avec des articles aléatoire prévenant de la table article, et des quantités
entre 1 et 10

18/10/2022
IV les fonctions

1 Fonction qui retourne une valeur scalaire Syntaxe :


Syntaxe :
Create Function Nom_Procedure (Nom_Param1 Type_Donnée, …)
Returns type_de_retour
as
Instructions
...
Return Valeur

Exemple :

Créer une fonction nommée F_NbrCommandes qui retourne le nombre de commandes

18/10/2022
Create Function F_NbrCommandes() Returns int

As

begin

declare @Nbr int

Set @Nbr = (Select count(NumCom) from Commande)

Return @Nbr

end

18/10/2022
2 Fonction qui retourne une table

Syntaxe :

Create Function Nom_Fonction (Nom_Param1 Type_Donnée, …) Returns nom_table

Table ( champ1 type1, …)


As
Select …
Return

Exemple :
Créer une fonction nommée F_ListeArticles qui return la liste des articles d'une commande dont le
numéro est donné en paramètre :

18/10/2022
Create Function F_ListeArticles (@NumCom int ) Returns Liste-Art Table ( Num int , nom varchar(29))
As
Select A.NumArt, NomArt From Article A, LigneCommande LC
Where LC.NumArt=A.NumArt and LC.NumCom=@NumCom

--Exécuter cette procédure pour afficher la liste des articles de la commande numéro 1 :
Select * from F_ListeArticles (1)

18/10/2022
V. les déclencheurs (Triggers)

1 Définition :
Les triggers peuvent intercepter les opérations sur les données de la table avant qu'elles ne soient
définitivement appliquées. Ils peuvent alors interrompre les traitements de mise à jour et selon
certaines conditions annuler ces modifications, leur associer des traitements complémentaires ou
laisser le système poursuivre leur validation. Les déclencheurs peuvent être associés à trois types
d'actions de déclenchement sur une table :
Déclencheurs d'insertion : Se déclenchent suite à une opération d'ajout d'enregistrements dans la
table ;
Déclencheurs de modification : Se déclenchent suite à une opération de modification des
enregistrements de la table ;
Déclencheurs de suppression : Se déclenchent suite à une opération de suppression
d'enregistrements à partir de la table.

18/10/2022
2 Types de Triggers
Les déclencheurs peuvent être de deux types : INSTEAD OF et AFTER.

Les déclencheurs INSTEAD OF : exécutés à la place de l'action de déclenchement ;

Sont vérifiés avant les contraintes d'intégrité associées à la table ce qui permet de
mettre en place des traitements qui complètent les actions de ces contraintes ;
Peuvent être associés aussi bien à des tables qu'à des vues ce qui permet la mise à
jour des données associées à ces vues ;
Ne peuvent être associés à des tables cible de contraintes d'intégrité référentielle
en cascade ;
Un seul déclencheur INSTEAD OF est autorisé par action de déclenchement dans
une table
Même si un trigger INSTEAD OF contient une action d'insertion sur la table ou la vue
à laquelle il est associé, il ne sera jamais exécuté à nouveau (exécution non
récursive).
Les déclencheurs AFTER : exécutés après la validation des contraintes
associées à la table. Si une contrainte n'est pas vérifiée ce type de déclencheurs ne
se déclenchera jamais ;
Ne peuvent être associés qu'à des tables ; 18/10/2022
Exec
sp_SetTriggerOrder
@triggername = 'MyTrigger',
@order = 'first|Last|None',
@stmttype = 'Insert|Update|Delete'
3 Fonctionnement des tables inserted et deleted
Au cours des opérations d'ajout, de suppression et de modification, le système utilise les tables
temporaires inserted et deleted. Ces tables ne sont accessibles qu'au niveau des triggers et leur
contenu est perdu dès que les triggers sont validés. Action d'ajout : Les enregistrements ajoutés sont
placés dans une table temporaire nommée inserted ;
Action de suppression : Les enregistrements supprimés sont placés dans une table temporaire nommée
deleted.
Action de modification : L'opération de modification est interprétée comme une opération de suppression
des anciennes informations et d'ajout des nouvelles informations. C'est pourquoi le système utilise
dans ce cas les deux tables temporaires deleted et inserted. En fait quand un utilisateur demande à
modifier des enregistrements, ceux ci sont d'abord sauvegardés dans la table temporaire deleted et la
copie modifiée est enregistrée dans la table inserted.
4 Fonctionnement des Triggers INSTEAD OF et AFTER
Cas où seul un trigger INSTEAD OF est associé à l'action de mise à jour (insert, delete ou update) : Dans le
trigger INSTEAD OF, les enregistrements ajoutés (respectivement modifiés ou supprimés) apparaissent
uniquement dans les tables temporaires mais pas dans la table d'origine et si le code associé à ce trigger ne
prend pas en charge l'ajout (respectivement la modification ou la suppression) de ces enregistrements, ils ne
seront pas ajoutés (respectivement modifiés et supprimés) même si aucune action n'annule le déclencheur.
5 suppression d’un déclencheur(Trigger)
Syntaxe :
Drop Trigger Nom_Trigger
6 modification d’un déclencheur(Trigger)
Syntaxe :
Alter Trigger Nom_Trigger
On Nom_Table
For Opération1, Opération2...
as
Nouvelles Instructions
Exemple :
Un utilisateur exécute l'action suivante :
Insert into commande values (100,'13/09/07').
……………..
18/10/2022
7 Création d’un déclencheur (Trigger)
Syntaxe :
Create Trigger Nom_Trigger
On Nom_Table
Instead Of | For Opération1, Opération2...
As
Instructions
Exercice:
1. Le trigger suivant interdit la modification des commandes

2. Le trigger suivant interdit la modification du numéro de commande et vérifie si la date saisie pour la date de
commande est supérieure ou égale à la date du jour

3. Le trigger suivant empêche la suppression des commandes ayant des articles associés

4. Le trigger suivant à la suppression d'une ligne de commande, remet à jour le stock et vérifie s'il s'agit de la
dernière ligne pour cette commande. Si c'est le cas la commande est supprimée

5. Le trigger suivant à la modification d'une ligne de commande vérifie si les quantités sont disponibles et met le
stock à jour

18/10/2022
1. Create Trigger Tr_Empêcher_Modif
On Commande
For Update
As
Rollback
2. Create Trigger Tr_Empêcher_Modif_Numcom
On Commande
For Update
As
if update(NumCom)
Begin
Raiserror('le numéro de commande ne peut être modifié',15,120)
Rollback
End
if update(DatCom)
Begin
if ((select count (DatCom) from inserted Where datediff(day,datcom,getdate() )>0)<> 0)
Begin
Raiserror('La date de commande ne peut pas être inférieur à la date en cours',15,120)
Rollback
End
End

18/10/2022
3. Create Trigger Tr_Empêcher_Suppr

On Commande

For Delete

As

Declare @a int

set @a =(Select count(numart) from lignecommande, deleted where lignecommande.numcom

=deleted.numcom)

if (@a>0)

Begin

Raiserror('Opération annulée. Une ou plusieurs commandes ont des articles enregistrés',15,120)

Rollback

End

18/10/2022
4. Create Trigger Tr_Supprimer_Ligne

On LigneCommande

For Delete

As

Update article set QteEnStock = QteEnStock + (select Sum(QteCommandee) from deleted

where article.NumArt=deleted.NumArt) from article, deleted where

deleted.numart=article.numart

Delete from commande where numcom not in (select numcom from lignecommande)

18/10/2022
5. CreateTrigger Tr_Modifier_Ligne On LigneCommande
For Update
As
Declare @a int
set @a=(select count(numart) from inserted, deleted, article where article.numart =
inserted.numart and article.numart = deleted.numart and inserted.QteCommandee >
QteEnStock+deleted.QteCommandee)
if (@a >0)
Begin
Raiserror(''Modification refusée. Quantités demandées non disponibles en stock',15,120)
Rollback
End
Else
update article set QteEnStock = QteEnStock + (select Sum(QteCommandee) from deleted where
deleted.NumArt=Article.NumArt) – (select Sum(QteCommandee) from inserted where
inserted.NumArt=Article.NumArt)
From article, inserted, deleted where inserted.numart = article.numart and article.numart =
deleted.numart

18/10/2022

Vous aimerez peut-être aussi