Introduction à SQL Server et Transact-SQL
Introduction à SQL Server et Transact-SQL
Automne 2019
Programmation
de bases de
données
Transact-SQL (SQL Server)
Table des matières
Historique des versions...................................................................................................................5
Chapitre 1, pour bien commencer….................................................................................................6
Chapitre 2, installation, configuration et connexion.......................................................................9
Mode d’authentification.............................................................................................................10
Authentification Windows.....................................................................................................10
Authentification SQL server..................................................................................................10
Étape 1 : Changer le mode d’authentification............................................................................10
Étape 2 : Créer une nouvelle connexion....................................................................................13
Étape 3 : Attribuer les rôles.......................................................................................................15
Étape 4, Connexion avec l’authentification SQL Server et création de la base de données......17
Où est stockée la base de données ?........................................................................................20
Chapitre 3, création des tables.....................................................................................................24
Types de données SQL Server...................................................................................................24
La propriété « IDENTITY » d’une table........................................................................................25
Création des tables avec SQL Server.........................................................................................28
Chapitre 4, le modèle de données avec SQL Server Management Studio.....................................30
Étape 0 : création de la base de données..................................................................................30
Étape 2 : Création des tables.....................................................................................................30
Étape 3, créer le schéma de la BD.............................................................................................31
Étape 4 : Définir les relations (la clé étrangère)........................................................................33
Définir la clé primaire composée..............................................................................................35
Chapitre 5, éléments du langage Transct-SQL..............................................................................37
Définitions.................................................................................................................................37
Éléments du langage Transact-SQL...........................................................................................37
Les variables et leurs déclarations.........................................................................................37
Les mots réservés : BEGIN …END............................................................................................37
Les structures de contrôles...................................................................................................37
Les curseurs..............................................................................................................................41
Chapitre 6, les procédures stockées..............................................................................................44
Définition..................................................................................................................................44
Avantages à utiliser les procédures stockées............................................................................44
Syntaxe simplifiée de définition d’une procédure stockée avec Transct-SQL...........................44
1
Saliha Yacoub
Exemple1 : Tous les paramètres sont en IN. (Insertion)........................................................45
Exécution d’une procédure dans son SGBD natif (MS SQL Server)........................................45
Exemple 3, utilisation de LIKE dans une procédure stockée..................................................46
Exemple 4 : Procédure avec un paramètre en OUTPUT........................................................47
Les fonctions stockées : Syntaxe simplifiée...............................................................................48
Cas d’une fonction qui ne retourne pas une table.................................................................48
Exemple 1, fonction avec paramètres...................................................................................48
Exécution d’une fonction dans MS SQL Server.......................................................................48
Exemple2 : fonction sans paramètres...................................................................................49
Cas d’une fonction qui retourne une table.............................................................................49
Exemple.................................................................................................................................49
Supprimer une fonction ou une procédure...............................................................................50
En conclusion pour les procédures et les fonctions..................................................................50
Les procédures stockées et les fonctions : les Templates.........................................................52
Chapitre 7, les Triggers ou déclencheurs.......................................................................................54
Définition..................................................................................................................................54
Rôle des triggers........................................................................................................................54
Syntaxe simplifiée.....................................................................................................................54
Principe de fonctionnement pour les triggers DML..................................................................55
Exemple 1, suppression en cascade..........................................................................................55
Exemple 2.................................................................................................................................56
Exemple 3.................................................................................................................................56
RAISERROR....................................................................................................................................57
Activer /désactiver un trigger....................................................................................................59
Supprimer un trigger.................................................................................................................60
Retour sur la commande CREATE TABLE : ON DELETE CASCADE..............................................60
En conclusion................................................................................................................................63
Chapitre 8, les transactions...........................................................................................................64
Notions de Transactions............................................................................................................64
Propriétés d’une transaction......................................................................................................64
Récupération d’une transaction................................................................................................66
Récupération complète de la base de données............................................................................66
Transactions concurrentes........................................................................................................67
2
Saliha Yacoub
Perte de mise à jour..................................................................................................................68
Les verrous................................................................................................................................68
Chapitre 9, optimisation de requêtes............................................................................................70
Introduction..................................................................................................................................70
Les index...................................................................................................................................70
Types d’index..............................................................................................................................72
Les CLUSTERED INDEX...........................................................................................................72
Les index non CLUSTERED INDEX..........................................................................................74
La commande CREATE INDEX....................................................................................................75
Suppression d’un index...............................................................................................................76
Afficher les index définis sur une table.....................................................................................76
Outils de mesures des performances........................................................................................76
Règles d’optimisation de requêtes.............................................................................................76
Chapitre 10, introduction à la sécurité de données......................................................................77
Introduction..............................................................................................................................77
Menaces courantes...................................................................................................................77
Injection SQL.........................................................................................................................77
Élévation de privilège............................................................................................................78
Détection des attaques et surveillance intelligente...............................................................79
Mots de passe.......................................................................................................................79
Rôles du serveur........................................................................................................................80
Rôles niveau bases de données.................................................................................................81
Privilèges sur les objets (tables, colonnes, lignes).....................................................................82
Par l’interface SQL Server Management Studio.....................................................................82
Avec les commandes SQL......................................................................................................85
Les commandes GRANT, REVOKE et DENY................................................................................88
La command GRANT, syntaxe simplifiée...............................................................................88
Les roles creés par les utilisateurs. (pas ceux prédéfinis)......................................................90
La commande REVOKE..........................................................................................................91
La commande DENY..............................................................................................................91
Les vues pour la sécurité des données : contrôle sur les lignes............................................92
Conclusion.................................................................................................................................93
Le chiffrement des données......................................................................................................93
3
Saliha Yacoub
Définition..............................................................................................................................93
Hachage « hashing » (chiffrement unidirectionnel)...............................................................93
Chiffrement des données (chiffrement bidirectionnel).........................................................94
Chiffrement des procédures et fonctions de la base de données.........................................95
Chiffrer les données contenues dans une table....................................................................95
Chiffrement des données dans le SGBD MS SQL Server........................................................95
Chiffrement des données dans le logiciel client ou le serveur d’application web.................97
Autre exemple chiffrement par clé symétrique sans certificat..............................................98
Autre exemple chiffrement par ENCRYPTBYPASSPHRASE...................................................100
Sources........................................................................................................................................102
4
Saliha Yacoub
Historique des versions
5
Saliha Yacoub
Chapitre 1, pour bien commencer….
Microsoft SQL Server est un Système de gestion de base de données relationnel et
transactionnel développé et commercialisé par Microsoft.
Microsoft SQL Server utilise le langage T-SQL (Transact-SQL) pour ses requêtes, c'est une
implémentation de SQL qui prend en charge les procédures stockées et les
déclencheurs. La dernière version est SQL Server 2022. La première ayant appartenu à
Microsoft seul est en 1994. (Contrairement à Oracle qui sort la première version en
1979 voire 1977)
Il faut savoir que, tous les SGBDs relationnels (Oracle, MS SQL Server, MySQL, SQLite,
DB2, PostgreSQL ..) utilisent un SQL standard.
Ce qui implique que TOUS ce que vous avez appris durant le cours de « Introduction aux
bases de données » s’applique et reste valable pour les autres SGBDRs à quelques
exceptions près.
Sauf le SQLite, les SGBD cités plus haut sont TOUS des SGBDS SERVEURS. SQLite
est un SGBD embarqué.
TOUS les SGBDs offrent une interface ou un logiciel de gestion des bases de
données. Pour Oracle, c’est SQL Developer. Pour MS SQL Server c’est SQL
Server Management Studio, pour MySQL c’est MySQL Workbench, pour SQLite
c’est SQLite DB Browser.
6
Saliha Yacoub
Cependant,
Les SGBDRs n’ont pas la même architecture. Pour Oracle, quelle que soit la
version, il manque la couche « Base de Données ». Tous les usagers sont
connectés à une unique base de données qui est ORCL dans la plupart des cas
(sinon xe). La base de données et créée au moment de l’installation. Ce point est
très important pour la suite du cours. Pour MS SQL Server, chaque utilisateur
doit créer sa propre base de données, et il peut en créer plusieurs BD.
Exemple :
Comme il est possible que vous ayez plus qu’une base de données, avant toute
utilisation de celle-ci il faudra l’indique au SGBD.
USE nomdelaBD;
Exemple
USE empclg;
Les attributs n’utilisent pas les mêmes types. Exemple, pour Oracle, on utilise le
VARCHAR2(n) alors pour MS SQL server c’est le VARCHAR(n). Avant de créer une
table, ce serait utile de consulter les types de données manipulés par le SGBD.
7
Saliha Yacoub
Attention : (Rappel)
Si une séquence démarre à 1 pour Oracle 11g, la valeur qui sera insérée est 2.
(nextval).Ce qui n’est pas le cas avec IDENTIT (1,1) qui indique que la valeur qui
sera insérée est 1.
Les SGBDR sont très différents concernant l’extension de la couche SQL. Ils sont
différents pour l’écritures des procédures stockées et des triggers. Cette session,
nous allons étudier le Transact-SQL qui est l’extension du SQL pour MS SQL
Server. À titre d’information, pour ORACLE, cette extension du SQL s’appelle :
PL/SQL. Pour SQLite, cette couche gère uniquement les triggers.
SQL Server Management Studio est un excellent outil pour créer et exploiter vos
bases de données MS SQL Server indépendamment d’un langage de
programmation. MAIS… il faut savoir que Visual Studio vous permet aussi de
créer et gérer vos bases de données MS SQL Server. On verra ce point plus loin.
Ce qu’il faut savoir pour la suite du cours, c’est que votre poste de travail est à la
fois serveur et client. Pas comme l’installation qu’on avait avec Oracle. Dans ce
cas, il faut être conscient que n’importe qui peut supprimer votre BD puisque
tous les étudiants sont ADMIN de leur poste de travail. Par conséquent il faut :
o Essayer le plus possible de garder votre poste de travail le reste de la
session.
o Garder en tout temps vos scripts SQL.
8
Saliha Yacoub
Chapitre 2, installation, configuration
et
connexion
Si vous n’avez pas déjà installé SQL server, vous devez le faire. L’installation de la base
de données est très simple et se fait automatiquement.
Nous avons besoin d’installer :
1- Le serveur de bases de données :
Vous devez aller sur le site suivant pour télécharger et installer SQL Server Express
2017 ou 2019 ou 2022.
[Link]
[Link]
Attention :
9
Saliha Yacoub
10
Saliha Yacoub
Mode d’authentification :
Authentification Windows : Si vous choisissez ce mode d’authentification, cela
veut dire que le serveur de base de données, lorsque vous essayez de vous connecter,
ne vous demandera pas de mot de passe. Utiliser ce mode d’authentification si vous
n’avez pas de compte sur le serveur de base de données. C’est avec ce mode que l’on se
connecte pour la première fois.
Authentification SQL server : Si vous choisissez ce mode d’authentification, cela
veut dire que vous avez un compte sur le serveur de bases de données. Vous avez besoin
d’un
nom d’usager, d’un mot de passe et d’une base de données. C’est ce mode
d’authentification que l’on va utiliser durant toute la session. C’est ce mode
d’authentification que vous allez avoir en entreprise.
Lorsqu’on établit une connexion pour la première fois, nous allons faire une
authentification Windows. (Vous n’avez pas encore de compte sur le Serveur SQL
server) —voir la figure suivante.
Attention :
11
Saliha Yacoub
Sinon, dérouler le nom du serveur, faire parcourir (ou <Browse for more …> et trouver
votre serveur et son instance.
Une fois que vous êtes connecté, allez sur les propriétés de votre connexion et changez
le mode d’authentification. Figure suivante.
A l’onglet Sécurite, choisir Mode d’authentification SQL Server et Windows. Faites OK.
Redémarrer le serveur. (Bouton droit puis redémarrer.).
12
Saliha Yacoub
Attention :
13
Saliha Yacoub
Il est probable que le serveur vous fasse une mise en garde quant au changement du
mode d’authentification et qu’il faut redémarrer le serveur. Faîtes juste OK.
14
Saliha Yacoub
Donner un nom significatif sans caractères spéciaux et sans accents
Choisir Authentification SQL Server.
Choisir un mot de passe qui respecte la stratégie des mots de passe Windows
Server
15
Saliha Yacoub
Une fois que cette étape est terminée, vérifier que votre connexion est bien créée. Pour
cela allez dans l’onglet Sécurité-puis Connexion et repérer votre connexion
Attention :
Pour créer la base de données vous devez avoir au moins le rôle dbcreator
Les membres du rôle de serveur dbcreator peuvent créer, modifier, supprimer et
restaurer n'importe quelle base de données.
Pour donner les droits à votre connexion, allez à votre connexion, bouton droit,
propriétés puis rôle du serveur
16
Saliha Yacoub
Puis Rôles du serveur.
Attention :
Ne jamais donner le rôle sysadmin. Les membres du rôle sysadmin peuvent effectuer
toute activité sur le serveur. Faîtes attention !!
17
Saliha Yacoub
Étape 4, Connexion avec l’authentification SQL Server et création
de la base de données.
Vous pouvez vous déconnecter du serveur et vous reconnecter avec votre nouvelle
connexion (SQL Server) comme suit.
Attention :
Attention :
18
Saliha Yacoub
Pour créer une nouvelle base de données, placez-vous à l’onglet bases de données, puis
nouvelle base de données. Ou utiliser la commande CREATE DATABASE
19
Saliha Yacoub
Avant de cliquer sur OK, cliquer sur propriétaire, vous allez avoir la figure suivante :
Cliquez ensuite sur parcourir, puis trouvez votre connexion et cochez-la. (voir figure
suivante).
Après la création de la base de données, nous allons faire en sorte que le login pointe
directement sur la nouvelle base de données.
20
Saliha Yacoub
Sous l’onglet Sécurité, déroulez les connexions. Repèrerez la vôtre. Puis bouton droit de
la souris et Propriétés.
Choisir ensuite le nom de votre BD par défaut. Tester à nouveau votre connexion.
Important :
Vous pouvez également créer votre base de données avec la commande CREATE
21
Saliha Yacoub
Ces fichiers sont dans :
C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS2017\MSSQL\DATA
Vous y trouverez deux types de fichiers pour chaque BD : L’un .mdf et l’autre. ldf
Les données sont stockées dans un fichier MDF, toutes les transactions, les
modifications de la base de données SQL Server effectuées par chaque transaction sont
stockées dans un fichier LDF
[Link] et Patochebd_log.ldf
Vous pouvez récupérer votre base en faisant : Bouton droit sur Bases de données, puis
Joindre. Vous aurez la fenêtre suivante.
22
Saliha Yacoub
Cliquer sur le bouton Ajouter. Choisir le fichier en question (le [Link]) puis faire OK,
puis OK.
Votre base de données va apparaitre dans l’explorateur d’objets. Vous pouvez alors
l’exploiter comme vous voulez.
23
Saliha Yacoub
Attention :
Une base de données ne peut être jointe plus qu’une fois.
Lorsque vous essayez de joindre une Base de données déjà jointe, cela provoquera une
erreur.
Il faut que vos fichiers soient dans le bon dossier.
24
Saliha Yacoub
Chapitre 3, création des tables
Types de données SQL Server
Type À partir de À
bigint -[Link].854.775.808 [Link].854.775.807
int -2147483648 2147483647
smallint -32768 32767
tinyint 0 255
bit 0 1
Decimal -10 ^ 38 1 10 ^ 38 -1
numeric -10 ^ 38 1 10 ^ 38 -1
money -922,337,203,685,477.5808 +922,337,203,685,477.5807
smallmoney -214,748.3648 +214,748.3647
Numerics approximatif
Type À partir de À
float 1,79 E + 308- 1,79 E + 308
reel -3.40E + 38 3.40E + 38
datetime et smalldatetime
Type À partir de À
datetime (3,33 exactitude millisecondes) 1 janvier 1753 31 déc 9999
smalldatetime (précision de 1 minute) 1 janvier 1900 6 juin 2079
Chaînes de caractères
Type Description
De longueur fixe de caractères Unicode avec une longueur maximum de
char
8000 caractères.
varchar Texte unicode de longueur variable allant jusqu’à 2 Go.
text Texte non unicode de longueur maximale 2Go
25
Saliha Yacoub
Les chaînes de caractères Unicode
Type Description
la longueur de données Unicode-fixe avec une longueur maximale de 4000
nchar
caractères.
la longueur de données Unicode et variable, avec une longueur maximum
nvarchar
de 4000 caractères.
nvarchar longueur Unicode données variables avec une longueur maximale de
(max) 230 caractères (SQL Server 2005 uniquement).
la longueur de données Unicode et variable, avec une longueur maximale
ntext
de 1073741823 caractères.
Binary Cordes
Type Description
De longueur fixe des données binaires d'une longueur maximale de 8000
binaire
octets.
De longueur variable des données binaires d'une longueur maximale de
varbinary
8000 octets.
varbinary De longueur variable des données binaires d'une longueur maximale de
(max) 231 octets (SQL Server 2005 uniquement).
De longueur variable des données binaires d'une longueur maximale de
image
2147483647 octets.
SI la propriété IDENTITY est définie sur une colonne, alors c’est le système qui insères
des données dans cette colonne (pas l’utilisateur).
26
Saliha Yacoub
Attention :
Vous ne pouvez [Link] une colonne existante pour y ajouter la prorité IDENTITY.
Exemple1 :
create table
Eleves (
num int identity,
nom varchar(30),
prenom
varchar(30),
constraint pkeleve primary key(num));
Lorsque vous utilisez la propriété IDENTITY pour définir une colonne d'identification,
tenez compte des éléments suivants :
27
Saliha Yacoub
Exemple 2
La numérotation automatique commence à 10 et elle est à pas de 2.
Sion on veut faire une insertion manuelle dans la colonne num (IDENTITY) il faut mettre INDENTITY_INSERT
a ON
Exemple 3 :
28
Saliha Yacoub
Création des tables avec SQL Server
Les mêmes syntaxes s’appliquent à la création de tables avec SQL Server.
Exemple1 : Dans l’exemple qui suit remarquez la colonne identity et le type money
create table
etudiants (
numad int identity
, nom varchar(20),
prenom varchar(30),
salaire money,
codep char(3),
constraint fkprg foreign
key(codep) references
programmes(codep),
constraint pketudiant primary key(numad)
Remarque1 : Avec SQL Server on peut définir un seul INSERT INTO et donner la lise des
valeurs.
Pour exécuter un commit après une opération DML, il faut mettre l’opération entre
begin transaction;
opérations DML
commit;
29
Saliha Yacoub
Exemple 2
begin transaction;
insert into etudiants (nom, prenom,salaire,codep) values
('Patoche','Alain',12.33,'tge');
insert into etudiants (nom, prenom,salaire,codep) values
('Gavroche','Miserable',1.33,'inf');
insert into etudiants (nom, prenom,salaire,codep) values
('Bien','Henry',18.33,'inf');
insert into etudiants (nom, prenom,salaire,codep) values
('Leriche','Alain',40.00,'inf');
commit;
En général, l’ensemble des contraintes que nous avons vues avec ORACLE se définissent
de la même façon avec SQL Server.
30
Saliha Yacoub
Chapitre 4, le modèle de données
avec
SQL Server Management Studio.
Parfois, il est intéressant, même très utile de concevoir le modèle de la base de données
(modèle relationnel) puis de générer le code SQL. C’Est le cas de la plupart des SGBD. On
se souvient par exemple du SQL Data Modeler du SGBD Oracle.
Pour MS SQL Server, c’est très simple de créer la base de données en utilisant un
schéma relationnel.
Vous pouvez soit obtenir une modèle relationnel d’une base de données déjà créée ou
tout simplement créer un nouveau schéma.
1- Faire bouton droit de sur l’onglet Tables de votre BD, puis table
2- Créer une table avec les colonnes souhaitées. Les types de données sont ceux
que nous avons au chapitre 3
31
Saliha Yacoub
3- Sélectionner la colonne de vous voulez qu’elle soit clé primaire, puis bouton
droit et faire : définir la clé primaire : cette étape est obligatoire si vous voulez
que la BD soit en 1FN.
Si vous voulez que votre clé primaire soit définie comme IDENTITY, alors :
a. Positionnez-vous à la colonne de la clé primaire1
b.Vérifiez que dans les propriétés de cette colonne, (à gauche2) la propriété
« colonne d’identité » soit la clé primaire.
c. Par la suite, vous allez remarquer que la propriété IDENTITY est bien définie
sur la colonne 3
32
Saliha Yacoub
2. Si vous avez ce message, faites OK
3. Ajouter ensuite les tables à votre schéma. Pour l’instant la seule table que nous
avons est EtuiantsInfo
33
Saliha Yacoub
Étape 4 : Définir les relations (la clé étrangère)
Une fois que vos tables sont créées, ou bien au fur et à mesure que vos tables vont se
créer, il sera important de définir les liens entre les tables. Ces liens sont évidemment
définis par le concept de Foreign Key ou clé étrangère.
Il est important de rappeler que les types de données et la taille des colonnes qui
définissent la clé primaire et la clé étrangère soient les mêmes.
On suppose que la table ProgrammesInfo est créée.
1. Sur la colonne Codep de EtudiantsInfo, (la colonne qui sera clé étrangère), faire
Relation comme le montre la figure
34
Saliha Yacoub
4. Vérifiez que vous avez bel et bien les bonnes colonnes avec les bonnes tables :
a. Vous pouvez changer le nom de la contrainte de FK 1
b. Vérifier la table et la colonne de la primary Key 2
c. Vérifier la table et la colonne de la FK3
35
Saliha Yacoub
5. Faire OK, puis fermer pour terminer.
6. Enregistrez.
Attention :
Si au moment d’enregister le diagramme vous avez cette fenêtre ……. Alors
36
Saliha Yacoub
votre clé primaire composées soient des clés étrangères comme dans la plupart des cas.
Il faudra alors les définir comme telle.
EtudiantsInfo
numad PogrammesInfo
codep
nom
nomprog
codep
CoursInfo
Nom de la Type de données
colonne CodeCours
titrecours Autoriser l char(3)
varchar(50)
ResultatsInfo
Nom de la Type de données Autoriser
colonne les
numad int
codeCours char(3)
note float
Il n’est pas nécessaire de générer le code SQL pour créer les tables, puis que celles-ci
sont déjà créées
37
Saliha Yacoub
Chapitre 5, éléments du langage
Transct-SQL
Définitions
La plupart des SGBDs relationnels offrent une extension du SQL, en y ajoutant des
déclarations de variables, des structures de contrôles (alternatives et les répétitives)
pour améliorer leurs performances
Transact-SQL ou T-SQL ou TSQL est l’extension du langage SQL pour Microsoft SQL
Server et Sybase. Transact-SQL est un langage procédural permettant d’implémenter
des fonctionnalités de bases de données que SQL seul ne peut implémenter.
Exemple :
DECLARE
@CHOIX int ;
SET @CHOIX
=1;
38
Saliha Yacoub
Ou encore
IF Boolean_expression
{ sql_statement | statement_block }
[ ELSE IF Boolean_expression
{ sql_statement | statement_block } ]
[ ELSE
{ sql_statement | statement_block } ]
Exemple: (ce bout de code est ce que nous appelons un bloc anonyme)
DECLARE
@sal money;
set @sal =40.00;
if @sal = (select salaire from etudiants where numad =8)
(select * from etudiants where numad =8);
else if @sal=1.33 (select * from ETUDIANTS WHERE
NUMAD=6); else (select * from etudiants);
Attention:
Lorsque vous avez un bloc d’instructions, celui-ci doit être placé entre BEGIN et END.
Exemple1:
DECLARE
@code char(3);
begin
set @code ='tge';
if @code like '%'+ (select codep from etudiants where numad =6)
+'%'
(select * from etudiants where numad =6);
else (select * from ETUDIANTS WHERE
NUMAD=1);
Dans les exemples précédents, remarquez:
Le bloc d’instructions BEGIN .. END
Le IF ..ELSE
Le IF ..ELSE IF ..ELSE
Comment est construit le LIKE
39
Saliha Yacoub
Exemple2
DECLARE
@code
char(3);
begin
set @code ='tge';
if @code like '%'+ (select codep from etudiants where numad =6)
+'%'
(select * from etudiants where numad =6);
else
BEGI
N
(select * from ETUDIANTS WHERE NUMAD=1);
INSERT INTO ETUDIANTS
(NOM,PRENOM,SALAIRE,CODEP)
VALUES('Mosus','Chat',12,'sim');
Remarquez:
Après le ELSE, nous avons trois instructions à exécuter. Un SELECT, un INSERT et un
UPDATE. Ces instructions sont placées entre BEGIN et END :
L’instruction CASE
Syntaxe :
CASE input_expression
WHEN when_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END
Ou bien.
CASE
WHEN Boolean_expression THEN result_expression [ ..n ]
[ ELSE else_result_expression ]
END
40
Saliha Yacoub
Exemple 1, case avec un SELECT
SELECT nom,prenom, codep
= CASE codep
WHEN 'inf' THEN
'Informatique' WHEN 'tge'
THEN 'Genie Ele' WHEN 'ele'
THEN 'Electronique' ELSE
'Aucun Programme'
END, salaire
FROM etudiants ;
Syntaxe :
WHILE Boolean_expression
{ sql_statement | statement_block | BREAK | CONTINUE }
Exemple
Augmenter le salaire des étudiants, tant que la moyenne est inférieure à 80. Mais si le
maximum des salaires dépasse 100 on arrête,
BEGIN
WHILE (select avg(salaire) from etudiants )<= 80
BEGIN update etudiants set salaire = salaire
+10; IF(select max(salaire) from etudiants) >100
BREAK; ELSE CONTINUE;
END;
END;
41
Saliha Yacoub
Les curseurs :
Les curseurs sont des zones mémoire (mémoire tampon) utilisées par les SGBDs pour
récupérer un ensemble de résultats issu d’une requête SELECT.
Pour MS SQL Server, les curseurs sont explicites, ce qui veut dire qu’ils sont associés à
une requête SELECT bien précise. Comme par exemple, le curseur CUR1 contiendra le
resultra de la requête : SELECT ename, job from emp where deptn=30;
Pour utiliser un curseur, nous avons besoin de le déclarer.
DECLARE nomCurseur CURSOR FOR SELECT … FROM
Exemple :
DECLARE
cur1 CURSOR FOR
SELECT idcircuit, coutcircuit FROM circuits;
Exemple1
42
Saliha Yacoub
DECLARE @id int, @cout int;
DECLARE cur1 CURSOR FOR SELECT idcircuit,
coutcircuit FROM circuits;
BEGIN
OPEN cur1 ;
print concat('numero','---','cout');
Exemple 2
BEGIN
OPEN Cout_cursor ;
FETCH NEXT FROM Cout_cursor INTO @cout;
WHILE @@FETCH_STATUS =
0 BEGIN
43
Saliha Yacoub
Par défaut, les curseurs sont Forward ONLY : ils ne sont pas scrollables.
Lorsqu’un curseur est déclaré avec l’attribut SCROLL alors on peut accéder au contenu
du curseur par d’autres option de la fonction FETCH. Nous pouvons avoir accès à la
première ligne, la dernière ligne, une position absolue, exemple la ligne 3. Position
relative à partir d’une position prédéfinie.
CLOSE Curmonument;
DEALLOCATE
Curmonument; END
Remarque : Nous reviendrons sur les détails concernant les curseurs plus loin dans le
cours.
44
Saliha Yacoub
Chapitre 6, les procédures stockées
Définition
Une procédure stockée est un ensemble d’instructions SQL précompilées stockées dans
le serveur de bases de données
CREATE PROCEDURE : indique que l’on veut créer une procédure stockée.
OR ALTER est optionnel, indique que l’on veut modifier la procédure stockée si celle-ci
existe déjà.
@parameter data_type : On doit fournir la liste des paramètres de la procédure avec le
type de données correspondant à chacun des paramètres.
[OUT | OUTPUT ] : Indique la direction en OUT ou en OUTPUT des paramètre de la
procédure. Par défaut les paramètres sont en IN. Lorsque les paramètres sont en IN, il
n’est pas nécessaire (c’est même une erreur) d’indiquer la direction.
45
Saliha Yacoub
AS : mot réservé qui annonce le début du corps de la procédure et la fin de la
déclaration des paramètres
BEGIN
Bloc SQL ou Transact-SQL
END;
Attention :
Les paramètres sont précédés du symboles @
Le type de paramètre IN OUT est indiqué uniquement si le paramètre est en OUT ou
INOUT (le type IN est par défaut) : La direction IN provoque une erreur si indiquée.
Exemple1 : Tous les paramètres sont en IN. (Insertion)
create procedure
insertionEtudiants (
@pnom varchar(20), @pprenom varchar(30),@psal
money,@pcodep char(3)
)
A
S
begin
insert into etudiants(nom , prenom ,salaire ,codep
) values (@pnom , @pprenom ,@psal ,@pcodep)
end;
Exécution d’une procédure dans son SGBD natif (MS SQL Server)
Pour exécuter une procédure stockée, on utilise les commandes execute ou exec. Il
faudra fournir la valeur des paramètres.
Exemple :
execute
insertionEtudiants @pnom
='Lenouveau', @pprenom
='lenouveau',
@psal=22.5,
@pcodep ='sim';
46
Saliha Yacoub
Même s’il est conseillé de passer les paramètres dans l’ordre de leur apparition dans la
procédure, MS SQL Server peut accepter la passation des paramètres dans n’importe
quel ordre. Par contre, les noms des paramètres sont très importants. En ce sens SQL
Server est contraire d’ORACLE (pour ORACLE c’est l’ordre des paramètres qui est
important et non le nom)
On aurait très bien pu faire ceci , le paramètre @nom est fourni en dernier.
execute
insertionEtudiants
@pprenom ='aaaa',
@psal=22.5,
@pcodep ='sim',
@pnom ='patate'Exemple 2 : Les paramètres en IN avec une sortie (SELECT)
create procedure
lister (
@pcodep char(3)
)
A
S
begin
select nom,prenom from etudiants where @pcodep =
codep; end;
Execution:
execute
lister
@pcodep='inf'
create procedure
ChercherNom (
@pnom varchar(20)
)
A
S
begin
47
Saliha Yacoub
select * from etudiants where nom Like '%'+ @pnom +'%';
end;
Execution
execute ChercherNom
@pnom='Le';
48
Saliha Yacoub
Les fonctions stockées : Syntaxe simplifiée.
Les fonctions stockées sont des procédures stockées qui retournent des valeurs. Leurs
définitions sont légèrement différentes d’une procédure stockée mais le principe
général de définition reste le même.
Cas d’une fonction qui ne retourne pas une table
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( [ { @parameter_name parameter_data_type
} ]
)
RETURNS return_data_type
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
[ ; ]
Attention :
1. Pour l’appel des fonction (Eéxécution), nous avons besoin de préciser le shéma
de la BD. Le shéma est toujours : [Link] .
2. Pour l’instant, tous les objets appartient à l’usager dbo.
3. Pour une fonction qui ne retourne pas une table, pas besoin du FROM pour le
select.
49
Saliha Yacoub
Remarque : le mappage des utilisateurs aux connexions, sera abordé plus loin.
Pour exécuter la fonction précédente :
select [Link]('inf');
select [Link]();
--pas de clause FROM
[ AS ]
RETURN [ ( ] select_stmt [ ) ]
[ ; ]
Exemple
Create FUNCTION
Cherchertousetudiants (@pcodep
char(3)) returns table
AS
return(
SELECT nom,prenom
FROM etudiants
WHERE @pcodep
=codep
) ;
50
Saliha Yacoub
L’appel (Exécution) d’une fonction qui retourne une table est diffèrent. Le SELECT dans
ce cas, doit utiliser la clause FROM puis que ce qui est retourner est une table. De plus,
si la fonction a des paramètres en IN (implicite) il faudra les déclarer et leur affecter des
valeurs.
51
Saliha Yacoub
52
Saliha Yacoub
Les procédures stockées et les fonctions : les Templates.
Voici le code généré par SQL Server lorsque vous essayer de créer une procédure ou une
fonction
================================================
-- Template generated from Template Explorer using:
-- Create Procedure (New Menu).SQL
--
-- Use the Specify Values for Template Parameters
-- command (Ctrl-Shift-M) to fill in the parameter
-- values below.
--
-- This block of comments will not be included in
-- the definition of the procedure.
--
==============================================
== SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER
ON GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE <Procedure_Name, sysname, ProcedureName>
-- Add the parameters for the stored procedure here
<@Param1, sysname, @p1> <Datatype_For_Param1, , int> =
<Default_Value_For_Param1, , 0>,
<@Param2, sysname, @p2> <Datatype_For_Param2, , int> =
<Default_Value_For_Param2, ,
0> AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT
statements. SET NOCOUNT ON;
53
Saliha Yacoub
Template function TABLE
-- ================================================
-- Template generated from Template Explorer using:
-- Create Inline Function (New Menu).SQL
--
-- Use the Specify Values for Template Parameters
-- command (Ctrl-Shift-M) to fill in the parameter
-- values below.
--
-- 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 FUNCTION <Inline_Function_Name, sysname,
FunctionName> (
-- Add the parameters for the function here
<@param1, sysname, @p1> <Data_Type_For_Param1, , int>,
<@param2, sysname, @p2> <Data_Type_For_Param2, , char>
)
RETURNS TABLE
AS
RETUR
N (
-- Add the SELECT statement with parameter references here
SELECT 0
)
GO
54
Saliha Yacoub
Chapitre 7, les Triggers ou
déclencheurs
Définition :
Les triggers sont des procédures stockées qui s’exécutent automatiquement quand un
événement se produit. En général cet événement représente une opération DML (Data
Manipulation Language ) sur une table. Les instructions DML doivent inclure INSERT,
UPDATE ou DELETE
Même si les triggers jouent un rôle important pour une base de données, il n’est pas
conseillé d’en créer trop. Certains triggers peuvent rentrer en conflit, ce qui rend
l’utilisation des tables impossible pour les mises à jour.
Syntaxe simplifiée :
AFTER spécifie que le déclencheur DML est déclenché uniquement lorsque toutes les
opérations spécifiées dans l'instruction SQL ont été exécutées avec succès.
Un trigger utilisant AFTER va effectuer l’opération DML même si celle-ci n’est pas valide,
55
Saliha Yacoub
un message erreur est quand même envoyé.
56
Saliha Yacoub
Utilisez les triggers AFTER avec une ROLLBACK TRANSACTION
Le FOR fait la même chose que AFTER, donc il va quand même insérer ou mettre à jour.
Par défaut on utilise AFTER.
PAS de INSTEAD OF sur des vues avec l’option with CHECK OPTION.
Pour INSTEAD OF pas d’instruction DELETE sur des tables ayant l’option ON DELETE
CASCADE (idem pour UPDATE)
BEGIN
select @ancienne = Salaire from
deleted ; select @nouvelle = Salaire
from inserted; IF (@ancienne >
@nouvelle)
rollback;
RAISERROR (15600,-1,-1, 'pas bon salaire');
Exemple 3
Le trigger ci-dessous fait en sorte que les salaires des employés respectent la fourchette
des salaires définie dans la table Emplois.
58
Saliha Yacoub
CREATE TRIGGER CTRLSALAIRES on
employesBidon after INSERT, UPDATE as
DECLARE
@minsalaire
money,
@maxsalaire
money,
@newsalaire
money; BEGIN
SELECT @minsalaire = salaireMin from emplois WHERE
typeemploi = (select typeemploi from inserted);
if (@newsalaire<@minsalaire or @newsalaire>@maxsalaire)
rollback TRANSACTION;
RAISERROR:
Génère un message erreur défini par l’utilisateur. Le message n’arrête pas le trigger (ce
n’est pas comme Raise_Application_error d’Oracle).
id_message, indique le numéro du message. Ce numéro doit être >50000. Lorsqu’il n’est
pas indiqué ce numéro vaut 5000.
Sévérité : indique le degré de gravité associé au trigger, ce niveau de gravité est défini
par l’utilisateurs. Ce nombre se situe entre 0 et 25. Les utilisateurs ne peuvent donner
que le nombre entre 0 et 18. Les nombre entre 19 et 25 sont réservés aux membres du
groupe sysadmin. Les nombre de 20 à 25 sont considérés comme fatals. Il est même
possible que la connexion à la BD soit interrompue.
59
Saliha Yacoub
Si ce nombre est négatif, il est ramené à 1.
Exemples :
Erreur : Sévérité
Duplication de Clé primaire 14
Problème de FK 16
Problème insertion (valeurs non conformes) 16
Violation de contrainte Check 16
Trigger DML 15 ou 16
Si vous prêtez attention aux messages erreurs renvoyés par le SGBD, vous constaterez
qu’ils se présentent sous la forme du RAISERROR vous pouvez vous baser sur ces
messages pour fixer le degré de sévérité.
État : utilisé lorsque la même erreur définie par l’utilisateur se retrouve à plusieurs
endroits, l’état qui est un numéro unique permet de retrouver la section du code ayant
générée l’erreur. L’état est un nombre entre 0 et 255. Les valeurs >255 ne sont pas
utilisées. Si négatifs alors ramenés à 0.
Exemples :
insert into EmpPermanent values(88,41111,12,'inf');
Ici, nous avons un problème de Forein key puisque le 88 n’est pas un dans la table
EmpClg. Pour la première fois, le niveau de sévérité est 16 est l’état est 0.
Vous pouvez également utiliser un try ---catch pour récupérer le message erreur
proprement : Dans le cas de l’exemple 2
60
Saliha Yacoub
use EmpclgDB;
begin try
begin transaction;
update EmpPermanent set Salaire =1 where empno
=12; commit transaction;
end try
begin catch
select ERROR_MESSAGE() as message, ERROR_SEVERITY() as
Gravité,
ERROR_STATE() as etat,@@TRANCOUNT
if @@TRANCOUNT>0
rollback; end catch;
Attention :
Les triggers sont définis sur une table , ce sont donc des objets de la table, tout comme
une colonne, une contrainte…
Exemples :
61
Saliha Yacoub
Pour réactiver votre trigger, utiliser la commande ENABLE. Cette commande a la même
syntaxe que la commande DISABLE.
Supprimer un trigger.
Un trigger est un objet de la base de données, il faudra utiliser la commande DROP pour
le détruire.
DROP TRIGGER [ F EXISTS ] [schema_name.]trigger_name [ ,.n ] [; ]
Exemple :
Les triggers sont un bon moyen de contrôler l’intégrité référentielle ( la Foreign KEY)
lors de la suppression d’un enregistrement référencé (ou des enregistrements
référencés). Si lors de votre conception, vous avez déterminé que les enregistrements
liés par la Foregin KEY doivent être supprimés car il s’agit d’un lien de composition,
comme dans le cas d’un livre et ses chapitres, c’est-à-dire que lorsqu’un livre est
supprimé alors tous les chapitres liés à ce livre doivent être également supprimé, ou
encore lorsqu’il s’agit d’une relation de généralisation, alors vous pouvez le faire à la
création de table.
Exemple
Voici la création de la table livres
62
Saliha Yacoub
create table
livres (
coteLivre char(5),
titre varchar(40) not null,
langue varchar(20) not
null, annee smallint not
null, nbPages smallint not
null,
constraint pklivre primary key(coteLivre)
);
Voici la table Chapitres
create table
Chapitres (
idChapitre char(7) constraint pkChapitre primary
key, nomChapitre varchar(40) not null,
coteLivre char(5) not null,
constraint fkLivre foreign key (coteLivre)
references livres(coteLivre)ON DELETE
CASCADE
)
Lorsqu’un livre (ou des livres) sont supprimés alors les chapitres de ce livre le sont aussi.
Attention :
La suppression en cascade à la création des tables n’est pas toujours recommandée sauf
si la conception l’exige.…
Pour tester :
---insertion dans livres--
begin transaction trans1
insert into livres values('IF001', 'Introduction à
C#','Français',2017,650); insert into livres values('IF002', 'SQL pour
Oracle 12C','Français',2015,500); insert into livres values('IF003',
'Oracle pour Java et PHP','Français',2016,700); insert into livres
values('IF004', 'Windows Server 2016','Anglais',2016,1100); insert into
livres values('MA001', 'Algébre Linéarie','Français',2013,400);
commit transaction trans1;
64
Saliha Yacoub
insert into Chapitres values('IF00110','les tableaux ','IF001');
insert into Chapitres values('IF00201','Concepts de bases de données
','IF002'); insert into Chapitres values('IF00202','Create
table ..','IF002');
insert into Chapitres values('IF00212','les
indexs','IF002'); insert into Chapitres
values('MA00101','introduction ','MA001'); insert into
Chapitres values('MA00102','Les vecteurs','MA001'); insert
into Chapitres values('MA0013','les matrices','MA001');
commit transaction trans2;
--pour tester
---en 1
begin transaction trans3;
delete from livres where coteLivre ='MA001' or coteLivre = 'IF002';
---en 2
rollback transaction trans3;
Exemple :
USE
[EmpclgDB] GO
/****** Object: Trigger [dbo].[deletecascdeDepartement]
****/ SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER
ON GO
ALTER trigger [dbo].[deletecascdeDeparetement] on [dbo].
[Departements]
instead of delete as
begin
declare
@code char(3);
SELECT @code = deptno FROM deleted;
update EmpPermanent set deptno = null where deptno
=@code; delete from Departements where deptno=@code;
end;
65
Saliha Yacoub
En conclusion :
1. Pour garantir l’intégrité de données en général et référentielle en particulier,
faîtes-le par la base de données au CREATE TABLE. Comme les PK, le FK, Les
Check…
2. Les triggers sont là pour renforcer l’intégrité des données. Leur avantage est
qu’on peut les désactiver au besoin. De plus ils s’exécutent automatiquement
(même s’ils sont oubliés).
3. Les procédures stockées sont un excellent moyen pour réduire les risques de
briser l’intégrité des données, à condition qu’elles soient utilisées.
66
Saliha Yacoub
Chapitre 8, les transactions
Notions de Transactions :
Une transaction est un bloc d’instructions DML exécutés et qui laisse la base de données
dans un état cohérent. Si une seule instruction dans le bloc n’est pas cohérente alors la
transaction est annulée, toutes les opérations DML sont annulées. Le principe de
transaction est implémenté dans tous les SGBDs.
Exemple :
begin transaction trans1;
insert into Departements values('dept', 'resources humaines');
update EmpPermanent set deptno ='inf' where empno=1;
update EmpPermanent set Salaire = 45000 where empno =1;
insert into Departements values('dept', 'resources humaines');
commit transaction trans1;
Le bloc d’instruction précédent ne va s’exécuter puisque nous avons un problème avec
le INSERT, la clé primaire est dupliquée.
67
Saliha Yacoub
I : pour Isolement
Les modifications effectuées par des transactions concurrentes doivent être isolées
transaction par transaction. Une transaction reconnaît les données dans l'état où elles
se trouvaient avant d'être modifiées par une transaction simultanée, ou les reconnaît
une fois que la deuxième transaction est terminée, mais ne reconnaît jamais un état
intermédiaire.
Des fonctionnalités de verrouillage (verrou ou LOCK) permettant d'assurer l'isolement
des transactions.
D : Durabilité
Lorsqu'une transaction durable est terminée, ses effets sur le système sont permanents.
Les modifications sont conservées même en cas de défaillance du système
Des fonctionnalités de consignation assurent la durabilité des transactions. Pour les
transactions durables, l'enregistrement du journal est renforcé sur le disque avant les
validations des transactions. Ainsi, en cas de défaillance du matériel serveur, du système
d’exploitation ou de l’instance du Moteur de base de données lui-même, l’instance
utilise au redémarrage les journaux des transactions pour restaurer automatiquement
toutes les transactions incomplètes jusqu’au moment de la défaillance du système
Pour SQL SERVER certaines transactions sont atomique et donc auto-commit, instruction
individuelle qui n’ont pas de BEGIN Transaction.
D’autres transaction sont explicites, dans ce cas elle commence par un : BEGIN
TRANSACTION et se termine par un COMMIT Transaction ou un ROLLBACK.
BEGIN TRANSACTION : est comme un point, ou un état où les données référencées par
une connexion sont cohérentes logiquement et physiquement. En cas d'erreur, toutes
les modifications de données effectuées après BEGIN TRANSACTION peuvent être
annulées pour ramener les données à cet état de cohérence connu. Chaque transaction
dure jusqu’à ce qu’elle soit terminée proprement par un COMMIT ou par un ROLLBACK ;
Une transaction n’est pas uniquement une unité logique de traitement des données, c’est aussi
une unité de récupération.
Après qu’une transaction ait terminé avec succès (commit) le SGBDR garantit que les
changements seront permanents dans la BD. Cela ne veut pas dire, cependant, que les
changements ont été écrits sur le disque dans le fichier physique de la BD. Ils peuvent être
encore seulement dans la mémoire de l’ordinateur.
Supposons que 1 seconde après le commit et avant que les changements soient écrits sur le
disque, une panne électrique vient tout effacer le contenu de la mémoire et en même temps les
changements tout juste ‘comités’.
Dans une telle situation, le SGBDR sera quand même capable, au redémarrage, de poursuivre la
mise à jour en récupérant la transaction des journaux. Cela est possible à cause d’une règle qui
stipule que les journaux sont physiquement sauvegardés sur le disque avant que le commit
complète.
Cette double sauvegarde ou redondance des données permet de récupérer non seulement une
transaction, mais une BD complète advenant une panne du disque.
Au moment du redémarrage du SGBDR, toutes les transactions qui n’ont pas complété seront
annulées. Celles qui n’ont pas été sauvegardées dans la BD seront rejouées à partir des
journaux.
69
Saliha Yacoub
À intervalle régulier le SGBDR sauvegarde le contenu de ses structures de données en
mémoire dans le fichier physique de la BD. Au même moment un enregistrement ‘CheckPoint’
est ajouté au journal indiquant que toutes les transactions complétées avant le CP sont
contenues dans la BD sur le disque.
Pour déterminer quelles transactions seront annulées et quelles transactions seront rejouées, le
SGBDR utilise cet enregistrement CP dans le journal.
Temps tcp tp
T1
T2
T3
T4
T5
CheckPoint Panne
Figure 1: États de 5 transactions au moment de la panne dans le journal des transactions
Transactions concurrentes
Un SGBDR permet à plusieurs transactions d’accéder la même information en même temps.
Pour éviter que les transactions interfèrent l’une avec l’autre, des mécanismes sont nécessaires
pour contrôler l’accès aux données.
70
Saliha Yacoub
Perte de mise à jour
Les verrous
Le verrouillage est un mécanisme utilisé par le Moteur de base de données SQL Server
pour synchroniser l'accès simultané de plusieurs utilisateurs à la même donnée.
Avant qu'une transaction acquière une dépendance sur l'état actuel d'un élément de
données, par exemple par sa lecture ou la modification d'une donnée, elle doit se
protéger des effets d'une autre transaction qui modifie la même donnée. Pour ce faire,
la transaction demande un verrou sur l'élément de données. Le verrou possède
plusieurs modes, par exemple partagé ou exclusif. Le mode de verrouillage définit le
niveau de dépendance de la transaction sur les données
Le tableau suivant illustre les modes de verrouillage des ressources utilisés par le
Moteur de base de données.
71
Saliha Yacoub
Mode de verrouillage Description
Partagé (S) Utilisé pour les opérations de lecture qui n'effectuent
aucune modification ou mise à jour des données, par
exemple une instruction SELECT
Mise à jour (U) Utilisé pour les ressources pouvant être mises à jour.
Empêche une forme de blocage courante qui se produit
lorsque plusieurs sessions lisent, verrouillent et mettent à
jour des ressources ultérieurement.
Exclusif(X) Utilisé par les opérations de modification de données,
telles que INSERT, UPDATE ou DELETE. Empêche des mises
à jour multiples sur la même ressource au même moment.
72
Saliha Yacoub
Chapitre 9, optimisation de requêtes
Introduction.
En principe, lorsqu’une requête SQL est envoyée au SGBD, celui-ci établit un plan
d’exécution. Le module se charge d’établir un plan d’exécution s’appelle Optimizer.
1. Validation syntaxique
2. Validation sémantique
3. Utilisation éventuelle d’un plan précédemment produit
4. Réécriture/Simplification de la requête
5. Exploration des chemins d’accès et estimation des coûts.
6. Désignation du chemin le moins coûteux, génération du plan d’exécution et mise
en cache de ce dernier.
Les index
73
Saliha Yacoub
Le rôle d’un index est d’accélérer la recherche d’information (lors d’un SELECT) dans une
base une base de données.
Par défaut, TOUS les SGBD entretiennent un index primaire qui est l’index crée sur la clé
primaire. Cependant les développeurs peuvent décider de créer d’autres index sur des
colonnes qui ne sont pas des PK.
Créer des index sur les colonnes de Foreign KEY pour accélérer les jointures,
sauf si la combinaison de FK forme une clé primaire (redondance d’index).
Créer des index sur les colonnes de la clause de la clause WHERE sauf si le
WHERE contient un like de fin (WHERE nom like ‘%CHE’), ou si le WHERE
contient une fonction.
Créer des index sur des colonnes utilisées dans un ORDER BY, un GROUP BY,
un HAVING.
Créer des index sur une colonne ayant une petite plage de valeurs inutiles.
(NULL)
Créer des index une fois que les insertions sont complétées.
Attention :
Même si les indexs sont des accélérateurs, trop d’index ralenti le SGBD. Il ne faudrait
pas que le SGBD passe son temps à maintenir TOUS les index.
Les index ralentissent le système durant les insertions, car la table des index doit être
mis à jour.
74
Saliha Yacoub
Types d’index :
MS SQL server manipule deux types d’index : CLUSTERED index et les NON CLUSTERD
index
Les CLUSTERED INDEX :
Il existe un seul CLUSTERED index par table. Ces index stockent les lignes de données de
la table en fonction de leurs valeurs de clé. Les index clustérisés trient et stockent les
lignes de données dans la table ou la vue en fonction de leurs valeurs de clé
En principe, toutes les tables devraient avoir un index cluster défini sur la ou les
colonnes ayant la propriété d’unicité ou de clé primaire. Par défaut lorsque SQL server
crée une table avec clé primaire, il y ajoute un CLUSTERD index .
Exemple, remarquez la table joueurs suivantes créé avec un index Cluster sur la clé
primaire. Cet index est créé à la création de la table joueurs dès que la clé primaire a
été indiquée.
L’index non cluster (vert) a été rajouté par le développeur
Si vous voulez mettre un autre index Cluster sur votre table il faudra :
1. À la création de table indique que la PK n’est pas un index Cluster
75
Saliha Yacoub
CREATE CLUSTERED INDEX INDXALIAS ON personnages(ALIAS);
Sur quelles colonnes est-ce qu’il est conseillé de créer des index Clustérisés ?
Des colonnes avec des valeurs uniques ou très peu de valeurs identiques.
Colonne définie avec IDENTITY
Colonnes fréquemment utilisées pour trier (ORDER BY) les données extraites
d’une table.
Colonne avec accès séquentiel mais avec un where between, car un ordre est
spécifié.
Pour quels types de requêtes un index Clustérisé serait conseillé ?
Requêtes avec qui retournes une plage de valeurs : WHERE >, WHERE <,
WHERE BETWEEN ..
Retourne un résultat volumineux
Pour les jointures
Order by et group by
Dans les index Clustérisés le système est organisé sous forme d’arborescence binaire
parfaitement équilibré. B-Arbre. Le parcours de l’arbre est suffisant pour obtenir toute
l’information désirée. Voir exemple plus bas.
76
Saliha Yacoub
empno PageId
1 101
10 102
empno nom Prn empno nom Prn empno nom Prn empno nom Prn
1 Patoc aa 5 Yag ss 10 vlad jj 13 Pic az
2 Roy bb 6 Beta vv 11 ruby so 14 pac ab
3 Bien cc 7 Alp ww 12 mos pp
4 Bla dd 8 Ali aa Page 109
9 Boom yy Page 107
Page 105
Page 106
77
Saliha Yacoub
La commande CREATE INDEX
En général :
78
Saliha Yacoub
Suppression d’un index
On peut activer l’affichage du plan d’exécution des requêtes avec la commande Ctrl-M dans MS
SQL Studio.
– R2 : Créez des indexes sur les colonnes que vous utilisez dans la clause WHERE.
Pour plus de performances, ces indexes doivent-être créés après l’insertion des
données dans la table.
79
Saliha Yacoub
Chapitre 10, introduction à la sécurité
de
données
Introduction
Aucune méthode universelle n'existe pour créer une application cliente SQL Server
sécurisée. Chaque application est unique au niveau de sa configuration, de son
environnement de déploiement et de ses utilisateurs. Une application relativement
sécurisée lors de son déploiement initial peut devenir moins sécurisée avec le temps. Il
est impossible d'anticiper avec précision sur les menaces qui peuvent survenir dans le
futur.
Menaces courantes :
Les développeurs doivent connaître les menaces de sécurité, les outils disponibles pour les
contrer et la manière d'éviter les défaillances de sécurité qu'ils se créent eux-mêmes. La
sécurité peut être envisagée comme une chaîne dans laquelle un maillon manquant
compromet la solidité de l'ensemble. La liste suivante comprend quelques menaces de
sécurité courantes évoquées plus en détail dans les rubriques de cette section.
Injection SQL
L'injection SQL est le processus qui permet à un utilisateur malveillant d'entrer des
instructions Transact-SQL au lieu d'une entrée valide. Si l’entrée est transmise
directement au serveur sans validation et si l’application exécute accidentellement le code
injecté, l’attaque risque d’endommager ou de détruire des données.
Important :
Vous pouvez déjouer les attaques d'injection SQL Server à l'aide de procédures
stockées et de commandes paramétrées, en évitant le code SQL dynamique et en
limitant les autorisations de tous les utilisateurs :
Validez TOUTES les entrées.
Les Injection SQL peuvent se produire en modifiant une requête de façon à ce qu’elle soit
toujours exécutée (retourne toujours vrai) en changeant la clause WHERE ou avec un
opérateur UNION
80
Saliha Yacoub
Exemples:
SELECT * from utilisateurs where nom = @nom, en [Link]
SELECT * from utilisateurs where nom = ? en PDO
En théorie cette requête ramène les informations (mot de passe) d’un utilisateur dont le
nom est en paramètre, donc seules les personnes connaissant la valeur du paramètre
nom pourront chercher les informations correspondantes
Si les deux requêtes précédentes étaient dans des procédures stockées, le problème ne
se serait pas posé. La validation des entrées est ESSENTIELLE.
Élévation de privilège :
Les attaques d'élévation de privilège se produisent lorsqu'un utilisateur s'empare des
privilèges d'un compte approuvé, un administrateur ou un propriétaire par exemple.
Exécutez toujours le code sous des comptes d'utilisateurs disposant des privilèges
minimums et attribuez uniquement les autorisations nécessaires
81
Saliha Yacoub
Attention :
Évitez l'utilisation des comptes d'administrateur (comme Sa pour SQL Server, root pour
MySQL et system pour Oracle) pour l'exécution du code.
Supprimer les comptes utilisateurs non utilisés
Supprimer les comptes utilisateurs par défaut
Donnez les privilèges selon les besoins.
Attention :
Ne pas afficher de messages d'erreur explicites affichant la requête ou une partie de la
requête SQL. Personnalisez vos messages erreur.
Mots de passe
De nombreuses attaques réussissent lorsqu'un intrus a su deviner ou se procurer le mot
de passe d'un utilisateur privilégié. Les mots de passe représentent la première ligne de
défense contre les intrus, la définition de mots de passe forts est donc un élément
essentiel de la sécurité de votre système. Créez et appliquez des stratégies de mot de
passe pour l'authentification en mode mixte.
Attention :
Renforcer les mots de passe.
Utilisez la stratégie des mots de passe pour les comptes sa, root et system.
82
Saliha Yacoub
Rôles du serveur :
SQL Server fournit des rôles au niveau du serveur pour vous aider à gérer les
autorisations sur les serveurs
SQL Server fournit neuf rôles serveur fixes. Les autorisations accordées aux rôles serveur
fixes (à l’exception de public) ne peuvent pas être changées.
Les rôles du serveur sont attribués aux connexions
Rôles Description
sysadmin Les membres du rôle serveur fixe sysadmin peuvent effectuer
n’importe quelle activité sur le serveur.
serveradmin Les membres du rôle serveur fixe serveradmin peuvent modifier
les options de configuration à l’échelle du serveur et arrêter le
serveur.
securityadmin Les membres du rôle serveur fixe securityadmin gèrent les
connexions et leurs propriétés. Ils peuvent attribuer des
autorisations GRANT, DENY et REVOKE au niveau du serveur. Ils
peuvent également attribuer des
autorisations GRANT, DENY et REVOKE au niveau de la base de
données, s’ils ont accès à une base de données. En outre, ils
peuvent réinitialiser les mots de passe pour les connexions SQL
Server .
processadmin Les membres du rôle serveur fixe processadmin peuvent mettre
fin aux processus en cours d’exécution dans une instance de SQL
Server.
setupadmin Les membres du rôle serveur fixe setupadmin peuvent ajouter et
supprimer des serveurs liés à l’aide d’instructions Transact-
SQL. (L’appartenance au rôlesysadmin est nécessaire pour
utiliser Management Studio.)
bulkadmin Les membres du rôle serveur fixe bulkadmin peuvent exécuter
l’instructionBULK INSERT.
diskadmin Le rôle serveur fixe diskadmin permet de gérer les fichiers disque.
dbcreator Les membres du rôle serveur fixe dbcreator peuvent créer,
modifier, supprimer et restaurer n’importe quelle base de
données.
public Chaque connexion SQL Server appartient au rôle
serveur public. Lorsqu'un principal de serveur ne s'est pas vu
accorder ou refuser des autorisations spécifiques sur un objet
sécurisable, l'utilisateur hérite des autorisations accordées à
public sur cet objet. Vous ne devez affecter des autorisations
publiques à un objet que lorsque vous souhaitez que ce dernier
83
Saliha Yacoub
soit disponible pour tous les utilisateurs. Vous ne pouvez pas
modifier l’appartenance au rôle public.
Roles Description
84
Saliha Yacoub
db_datawriter Les membres du rôle de base de données
fixe db_datawriter peuvent ajouter, supprimer et
modifier des données dans toutes les tables utilisateur.
85
Saliha Yacoub
Dans cette figure on voit que :
La connexion interfaceConnexion est mappée sur un utilisateur de même nom.
La base de données de l’utilisateur est EmpclgDb
Le role BD de l’utilisateur est public. Un role public ne donne aucun droit sur la
BD. L’utilisateur peut faire un USE EmpclgDb et rien d’autre.
Si on clique pour générer le script on aura le script suivant :
USE [master]
GO
CREATE LOGIN [interfaceConnexion] WITH
PASSWORD=N'123456', DEFAULT_DATABASE=[EmpclgDB],
CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
USE
[EmpclgDB] GO
CREATE USER [interfaceConnexion] FOR LOGIN
[interfaceConnexion] GO
86
Saliha Yacoub
Voici le script obtenu pour une connexion AdoConnexion par l’interface Management
Studio
USE [master]
GO
CREATE LOGIN [AdoConnexion] WITH PASSWORD=N'Local$33',
DEFAULT_DATABASE=[ adoExemple], CHECK_EXPIRATION=ON,
CHECK_POLICY=ON
GO
USE
[adoExemple]
GO
CREATE USER [AdoConnexion] FOR LOGIN
[AdoConnexion] GO
USE
[adoExemple]
GO
ALTER ROLE [db_datareader] ADD MEMBER
[AdoConnexion] GO
USE
[adoExemple]
GO
87
Saliha Yacoub
L’usager AdoConnexion a le droit de faire select, update, insert et Delete sur toutes les
table de la base de données adoExemple. Mais, il ne peut pas créer des objets ou les
altérer
Avec la connexion AdoConnexion, on peut faire :
select * from etudiants;
select * from programmes;
insert into programmes values (200,'Mathématiques');
update programmes set nom_programme ='Art moderne'
where code_prog =412;
delete from etudiants where numad=1;
Question : Quel est le rôle Base de données qu’on aurait dû attribuer à AdoConnexion
pour que l’usager puisse créer la table cours ?
88
Saliha Yacoub
login logPatoche;
89
Saliha Yacoub
PatocheUser est un utilisateur orphelin. Aucun accès à aucune BD.
Pour créer un utilisateur non orphelin, donc rattachée à une base de données
EmpclgDB par exemple, il faudra :
1. Avoir le role sysadmin
2. Faire un USE sur la BD EmpclgDB.
En faisant use EmpclgDB, puis CREATE USER, l’utilisateur crée est rattaché à la BD
BdGestion. Mais il n’a aucun droit sur aucun objet de la BD.
Exemple :
use EmpclgDB;
create login logPatoche with password
='alainPatoche$33'; create user PatocheUser for login
logPatoche;
90
Saliha Yacoub
Avec ces role l’utilisateur PatocheUser peut faire, entre autres :
create table
TabledePatoche (
id_Personne int
identity(1,1) , nom
varchar(20) not null,
constraint pk_personnne primary key (id_Personne)
);
Attention :
Lorsque vous donnez des droits sur la base de données, ces droits s’appliquent à toutes
les table de votre base de données.
91
Saliha Yacoub
Attention :
Les droits de PatocheUser se limitent aux TABLES est non aux procédures stockées.
Exemple, nous souhaitons donner le droit SLECT sur notre table Questions à un autre
utilisateur, qui est UserSimba. UserSimba est un utilisateur lié à une connexion et une
base de données avec aucun role sur le serveur ni sur la base de données (il a le role
Public) car il a été créé comme suit :
use BdJeu;
create login logSimba with password
='Simbaleroy$22'; create user SimbaUser for login
logSimba;
92
Saliha Yacoub
On peut cependant permettre certaines actions sur les table pour le user UserSimab
Le ALL est à déconseiller. Il vaut mieux attribuer les autorisations ou les privilèges au
besoin
Exemples :
93
Saliha Yacoub
Grant select, insert on categories to SimbaUser;
grant select, insert, update(enonce) on Questions to
SimbaUser; grant select on personnes to SimbaUser with grant
option;
WITH GRANT OPTION, signifie que l’utilisateur qui a reçu le privilège peu donner le même
privilège à un autre utilisateur.
Situation : vous êtes une équipe de 10, donc 10 users à travailler sur le même projet.
Vous utilisez donc des tables de ce projets. Ces tables ne vous appartiennent pas mais
vous y avez accès avec des autorisations
use BdJeu;
create role roleprojet;
Grant select, insert on categories to roleprojet;
grant select, insert, update(enonce) on Questions to
roleprojet;
Je viens de créer un role roleprojet avec un certain nombre de droits.
Tous ce que nous avon à faire c’est d’affecter le role aux usager qu’on veut.
Maintenant… imaginez que vous avez oublié de donner le privillège SELECT sur la table
joueurs pour les 10 users de l’équipe de projet. Comment allez-vous faire ? et surtout
comment ne pas oublier aucun utilisateur ?
94
Saliha Yacoub
Il suffit de faire un GRANT pour votre role. De cette façon, tous les users qui on eu le
role se verront GRANTÉ, le privilège.
La commande REVOKE.
La commande REVOKE permet de retirer des droits. (Des privilèges) . En principe les
privilèges ont été attribuer par la commande GRANT
Syntaxe :
REVOKE [ GRANT OPTION FOR ] <permission> [ ,...n ] ON
[ OBJECT :: ][ schema_name ]. object_name [ ( column [ ,...n
] ) ]
{ FROM | TO } <database_principal> [ ,...n ]
[ CASCADE ]
[ AS <database_principal> ]
Exemple :
revoke insert on Categories from SimbaUser;
La commande DENY
Il arrive qu’un utilisateur, ait hérité des droits car il est membre d’un role. Une façon de
ne pas autoriser (d’interdire ) l’utilisateur en question à ne pas faires certaine
opérations c’est avec la commande DENY
Syntaxe :
DENY { ALL [ PRIVILEGES ] }
| <permission> [ ( column [ ,...n ] ) ] [ ,...n ]
[ ON [ <class> :: ] securable ]
TO principal [ ,...n ]
[ CASCADE] [ AS principal ]
[;]
95
Saliha Yacoub
Les vues pour la sécurité des données : contrôle sur les lignes
Nous avons abordé les vues comme étant des objets de la base de données permettant
la simplification de requêtes. Dans ce qui suit, nous allons voir comment les vues
peuvent contribuer à la sécurité des données.
Les vues permettent de protéger l’accès aux tables en fonction de chacun des
utilisateurs. On utilise une vue sur une table et on interdit l’accès aux tables. C’est donc
un moyen efficace de protéger les données.
AS select_statement
[ WITH CHECK OPTION ]
[ ; ]
L’option WITH CHECK OPTION permet d’assurer que les modifications apportées à la
table (dont la vue est issue) via la vue respectent la CLAUSE WHERE.
Lorsqu’une ligne est modifiée via la vue, alors les données devraient rester cohérentes.
Exemple :
96
Saliha Yacoub
Conclusion
Voici ce qu’il faudra retenir pour l’instant pour la sécurité des données :
1. Utilisez des procédures stockées.
2. Renforcer les mots de passes des comptes utilisateurs
3. Évitez d’utiliser les comptes des supers usagers (root, sa, system..) pour les
opérations courantes.
4. Restreindre au minimum les autorisations, les privilèges pour les comptes
utilisateurs
5. Supprimer les comptes utilisateurs par défaut. (anonymous, Guest, scott….)
6. Éviter les comptes sans mot de passe
7. Valider toutes les entrées. Éviter les chaines null, drop, or, where …
8. Vérifier le format des données saisie.
9. N’afficher jamais les messages erreurs renvoyés par le SGBD. Personnalisez vos
messages erreurs.
Définition :
Le chiffrement est un procédé de la cryptographie qui consiste à rendre les données illisible ou
impossible à lire sauf si vous avez une clé de déchiffrement.
97
Saliha Yacoub
Chiffrement des données (chiffrement bidirectionnel)
Chiffrement symétrique
Méthode de chiffrement rapide qui utilise une seule clé; la même clé est utilisée pour
crypter et décrypter les données;
Algorithmes de chiffrement symétrique les plus utilisés;
o AES_128, AES_192 et AES_256;
o Supporté par MS SQL Server;
o Considéré le plus sécuritaire aujourd’hui;
o Choisi par le gouvernement américain pour remplacer l’algorithme de
chiffrement DES;
Données Données
originales Crypter
cryptées
Décrypter
Clé privée
Données
originales
98
Saliha Yacoub
Clé publique Clé privée
Données Données
Crypter Décrypter
originales cryptées
Données
originales
Il fortement recommandé de garder une copie de la BD dans laquelle les procédures ne sont pas
cryptées puisque la procédure pour les récupérer n’est si simple.
Il semblerait que cette méthode de chiffrement des procédures et fonctions ait été compromise et
que plusieurs logiciels commerciaux sont disponibles pour récupérer le code de ces procédures;
Figure end
4: Procédure chiffrée
Dans le cas d’une application web, le chiffrement des données se fait typiquement dans le serveur
d’application web. Dans le cas d’un programme Form, chaque programme est responsable du
chiffrement des données.
99
Saliha Yacoub
Notez que toutes les fonctions de chiffrements documentées dans MS SQL Server ne peuvent
pas être utilisées avec le SGBD Microsoft Azure.
Les logiciels qui utilisent une base de données Azure n’ont d’autres choix que de gérer le
chiffrement des données dans le logiciel client ou dans le cas d’application web dans le serveur
d’application web.
Chiffrement symétrique
ENCRYPTBYKEY, DECRYPTBYKEY
Cette fonction utilise une clé privée pour chiffrer les données. Cette clé doit être préalablement
créée avec la commande ‘CREATE SYMMETRIC KEY’. C’est au moment de créer la clé symétrique
que l’on peut spécifier l’algorithme de chiffrement.
print @info_a_chiffrer
print datalength( @info_a_chiffrer )
print @info_chiffree
print datalength( @info_chiffree )
ENCRYPTBYPASSPHRASE, DECRYPTBYPASSPHRASE
Ces fonctions utilisent une clé privée pour chiffrer les données. La clé est fournie sous la forme
d’une chaine de caractères (un mot de passe par exemple). La fonction utilise à l’interne la
commande ‘CREATE SYMMETRIC KEY’ pour créer une clé symétrique.
100
Saliha Yacoub
create table joueurs
(
no_jou int identity(1, 1)
constraint joueurs_pk primary key,
alias_j varchar(20) unique,
prenom_j varchar(20),
nom_j varchar(20),
carte_credit varbinary(8000) null,
mot_passe varbinary(8000) null
)
Fonction de hachage
HASHBYTES
101
Saliha Yacoub
Le “Framework .Net” offre tous les services de chiffrements dans le domaine
«[Link] »
Byte[] MotDePasseAChiffrer =
[Link](infoAHacher); MD5CryptoServiceProvider
[Link](MotDePasseAChiffrer);
return Convert.ToBase64String(infoHachee);
create database
ExempleEncryption; USE
ExempleEncryption;
102
Saliha Yacoub
-----Creer une clé symétrique encryptée par mot de passe.
USE ExempleEncryption;
CREATE SYMMETRIC KEY
SymmetricKey2 WITH ALGORITHM =
AES_128
ENCRYPTION BY password
='CemotdePasse123'; GO
USE
ExempleEncryption; GO
--ouverture de la clé pour
encryption OPEN SYMMETRIC KEY
SymmetricKey2
Decryption BY password
='CemotdePasse123'; GO
On met à jour la colonne à chiffrer
GO
--fermer la clé de chiffrement
CLOSE SYMMETRIC KEY
--on affiche pour voir que les données ont été cryptée.
A ce stade… on aurait pu supprimer la colonne CarteCredit
pour plus de sécurité.
103
Saliha Yacoub
USE
ExempleEncryption;
GO
OPEN SYMMETRIC KEY SymmetricKey2
Decryption BY password
='CemotdePasse123'; GO
USE
ExempleEncryption; GO
--ouverture de la clé pour
encryption OPEN SYMMETRIC KEY
SymmetricKey2
Decryption BY password
='CemotdePasse123'; GO
insert into Clients3 values('Blabla','un nom', '9999-9999-9999-
9999',EncryptByKey (Key_GUID('SymmetricKey2'),'9999-9999-9999-
9999'));
GO
--fermer la clé
CLOSE SYMMETRIC KEY
Autre exemple chiffrement par ENCRYPTBYPASSPHRASE
create table
Clients2 (
id_client int identity(1,1) constraint pkClient2 primary
key, nom varchar(30) not null,
prenom varchar(30) not null,
carteCredit varchar(20)
);
104
Saliha Yacoub
insert into Clients2 values ('Roy', 'Simon','9874-1234-5678-
1111'); insert into Clients2 values ('Lechat', 'Ryby','1234-9874-
2222-4569'); insert into Clients2 values ('Patouche',
'Mosus','2222-3333-4444- 5555');
Decryption
USE ExempleEncryption;
105
Saliha Yacoub
Sources
[Link]
2017
[Link]
[Link]
server-2017
[Link]
[Link]
versioning-guide?view=sql-server-2014
[Link]
server-2014#Clustered
[Link]
access/server-level-roles?view=sql-server-ver15
[Link]
sql-server-database-engine-and-azure-sql-database?view=sql-server-ver15
[Link]
security-scenarios-in-sql-server
[Link]
c/Inventory/admin/t_sql_backup.html
106
Saliha Yacoub