Lundi
Lundi
Lundi
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.
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,
ON (
LOG ON (
Un fichier de données:
• taille initiale: 3 Mo
• croissance du fichier: 20 %
• taille maximale: 10 Mo
Un fichier "Journal":
• taille initiale: 1 Mo
18/10/2022
Solution
• ON ( NAME = 'inscription_Data',
• SIZE = 3MB ,
• MAXSIZE = 10MB ,
• FILEGROWTH = 20%)
• FILENAME = 'C:\inscription_log.ldf' ,
• SIZE = 1MB ,
• MAXSIZE = UNLIMITED,
• FILEGROWTH = 10%);
18/10/2022
3. les tables , View
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
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 :
etudiant ( NumEtdINT , nom varchar (10), prenom varchar (10),adresse varchar (12),ville varchar (10))
Notation ( Num Etd INT, NumMat INT, note decimal (4,2), dateEvaluer DateTime)
18/10/2022
Solution
Create table etudiant ( NumEtd INT primary Key , nom varchar (10), prenom Varchar (10),adresse varchar (9),ville
Varchar (10))
Create table notation (NumEtd INT, NumMat INT, note decimal(2,2),dateEvaluer Datetime, Constraint
Modification de la table
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 :
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:
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 :
Exemple :
Créer le schéma ecole. Puis, Ajouter à ce schéma la table professeur ( code , nom )
Solution:
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,...).
Solution :
START WITH 10
INCREMENT BY 2
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 :
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 :
18/10/2022
l'Optimiseur de requête SQL
Objectifs
ATTENTION : vérifiez bien que la transformation opère une réduction du temps de traitement
Sélectionnez
SELECT CLI_ID, TIT_CODE, CLI_NOM,
SELECT * CLI_PRENOM, CLI_ENSEIGNE
FROM T_CLIENT FROM T_CLIENT
Sélectionnez Sélectionnez
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')
18/10/2022
1. Introduction
18/10/2022
Pour les exemples de ce cours, la base de données SQL Server GestionCom qui sera utilisée est comme suivante :
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
Set @b='commande'
18/10/2022
I.3 affichage d’informations
Exemples :
Soient @a et @b des variables de type Chaîne de caractères, @c et @d des variables de type entier
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
Else
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
18/10/2022
Select NumArt, DesArt, PUArt, 'Observation' =
Case
When QteEnStock=0 then 'Non Disponible'
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
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
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
Pour chaque article dont la quantité en stock est inférieure ou égale au seuil minimum enregistre une ligne de commande avec le
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
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
18/10/2022
I.9 Les transactions
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 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
4. Fermer un curseur
Close nom_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.
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
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 :
Exécution :
Exec Nom_Procedure
18/10/2022
2 Avec des paramètres en entrée :
Syntaxe :
Exécution :
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 :
Syntaxe :
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
Exemple :
18/10/2022
Create Function F_NbrCommandes() Returns int
As
begin
Return @Nbr
end
18/10/2022
2 Fonction qui retourne une table
Syntaxe :
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.
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
=deleted.numcom)
if (@a>0)
Begin
Rollback
End
18/10/2022
4. Create Trigger Tr_Supprimer_Ligne
On LigneCommande
For Delete
As
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