Support de Cours Parti1 SQL
Support de Cours Parti1 SQL
Support de Cours Parti1 SQL
Al-Hoceima
Université Abdelmalek Essaadi
Support de Cours
Administration des Bases de données
Avancées
Partie I : Rappel sur le Langage SQL
BOUFASSIL Asmae
Introduction
2
Introduction
Une base de données (BD) est un ensemble cohérent de données structurées et enregistrées
dans un support informatique. Les bases de données ont pris aujourd’hui une place essentielle
dans l’informatique, plus particulièrement en gestion. Au cours des trente dernières années,
des concepts, méthodes et algorithmes ont été développés pour gérer des données sur
mémoires secondaires ; ils constituent aujourd’hui l’essentiel de la discipline « Bases de
Données ». Cette discipline est utilisée dans de nombreuses applications. Il existe un grand
nombre de Système de gestion de base de données (SGBD) qui permettent de créer, de gérer
et d’interroger des bases de données. La première partie est consacré à l’étude du langage
SQL (sigle de Structured Query Language, en français langage de requête structurée) est
un langage informatique normalisé servant à exploiter des bases de données relationnelles.
SQL a été Créé en 1974, normalisé depuis 1986, le langage est reconnu par la grande majorité
des systèmes de gestion de bases de données relationnelles (abrégé SGBDR) du marché.
✓ Microsoft Access
✓ MySQL
✓ Oracle
3
SQL langage de récupération de données
❖ Quelques règles d’écritures en SQL :
Un nom d’objet (table, base, colonne contrainte, vue, etc…) doit avoir les caractéristiques
suivantes :
- Le langage autorise autant d’espaces et de saut de lignes que l’on veut entre les mots de la
programmation.
- Il ne faut pas oublier le point-virgule à la fin de chaque instruction, car c’est lui qui
déclenche son exécution.
❖ Types de données :
- Les principaux types de données ainsi que leurs limites sont décrits dans le tableau suivant :
4
Date et heure DATE Stockée sous forme
• LRD (Langage de récupération de données) : récupérer des données contenues dans une ou
plusieurs tables de la base.
[WHERE <condition>]
1. Projection
Sélection d’une ou plusieurs colonne(s).
Syntaxe:
La liste d’attributs sur laquelle la projection est effectuée doit être précisée après la clause.
2. Sélection
Sélection : Sélection d’une ou plusieurs ligne(s).
Syntaxe :
5
SELECT liste_attributs FROM table WHERE condition(s);
Une condition est une expression composée d’opérateurs (arithmétiques, logiques, …) et d’opérandes
(constantes ou attributs).
Exemple :
➢ IS NULL : teste si la valeur d'une colonne est une valeur nulle (inconnue).
➢ IN (liste) : teste si la valeur d'une colonne coïncide avec l'une des valeurs de la liste
➢ BETWEEN v1 AND v2 : teste si la valeur d'une colonne est comprise entre les
valeurs v1 et v2 (v1 <= valeur <= v2).
Exemple : quels sont les noms des pilotes qui gagnent entre 3.000 et 5.000 ?
SELECT NOMPIL FROM PILOTE WHERE SALAIRE BETWEEN 3000 AND 5000
Nous obtenons alors IS NOT NULL, NOT IN, NOT LIKE et NOT BETWEEN.
Exemple : quels sont les noms des avions différents de A310, A320, A330 et A340 ?
('A310','A320','A330','A340');
Opérateurs logiques : AND et OR. Le AND est prioritaire et les parenthèses doivent être
utilisé pour modifier l’ordre d’évaluation.
VILLE_ARR ='PARIS' ;
6
❖ Calculs horizontaux
Des expressions arithmétiques peuvent être utilisées dans les clauses WHERE et SELECT.
Ces expressions de calcul horizontal sont évaluées puis affichées et/ou testées pour chaque
tuple appartenant au résultat.
ADRESSE = 'BORDEAUX'
Exemple : quels sont les pilotes qui avec une augmentation de 10% de leur prime gagnent
moins de 5.000 € ? Donner leur numéro, leurs revenus actuel et simulé.
Les fonctions disponibles en SQL dépendent du SGBD. Sous ORACLE, les fonctions
suivantes sont disponibles :
7
NVL(n1, n2) permet de substituer la valeur n2 à n1, au cas où cette dernière est une valeur
nulle ;
ATTENTION : Tous les SGBD n'évaluent pas correctement les expressions arithmétiques
que si les valeurs de ses arguments ne sont pas NULL. Pour éviter tout problème, il convient
d'utiliser la fonction NVL (décrite ci avant) qui permet de substituer une valeur par défaut aux
valeurs nulles éventuelles.
Exemple : l’attribut Prime pouvant avoir des valeurs nulles, la requête donnant le revenu
mensuel des pilotes toulousains doit se formuler de la façon suivante.
8
WHERE ADRESSE = 'TOULOUSE'
Contrairement aux calculs horizontaux, le résultat d’une fonction agrégative est évalué une
seule fois pour tous les tuples.
SUM somme,
La fonction COUNT peut prendre comme argument le caractère *, dans ce cas, elle rend
comme résultat le nombre de lignes sélectionnées par le bloc.
SELECT AVG(SALAIRE)
FROM PILOTE
SELECT COUNT(NUMVOL)
FROM VOL
La colonne ou l'expression à laquelle est appliquée une fonction agrégative peut avoir des
valeurs redondantes. Pour indiquer qu'il faut considérer seulement les valeurs distinctes, il faut
faire précéder la colonne ou l'expression de DISTINCT.
9
Exemple : combien de destinations sont desservies au départ de Bordeaux ?
VILLE_DEP = 'BORDEAUX'
Il est possible avec SQL d'ordonner les résultats. Cet ordre peut être croissant (ASC) ou
décroissant (DESC) sur une ou plusieurs colonnes ou expressions.
L'argument de ORDER BY peut être un nom de colonne ou une expression basée sur une ou
plusieurs colonnes mentionnées dans la clause SELECT.
Exemple : En une seule requête, donner la liste des pilotes Marseillais par ordre de salaire
décroissant et par ordre alphabétique des noms.
FROM PILOTE
Pour vérifier qu’une donnée est absente dans la base, le cas le plus simple est celui où
l’existence de tuples est connue et on cherche si un attribut a des valeurs manquantes.
Il suffit alors d’utiliser le prédicat IS NULL. Mais cette solution n’est correcte que si les
tuples existent. Elle ne peut en aucun cas s’appliquer si on cherche à vérifier l’absence de
tuples ou l’absence de valeur quand on ne sait pas si des tuples existent.
Exemple : Les requêtes suivantes ne peuvent pas être formulées avec IS NULL.
Quels sont les pilotes n’effectuant aucun vol ? Quelles sont les villes de départ dans lesquelles
aucun avion n’est localisé ?
Pour formuler des requêtes de type “ un élément n’appartient pas à un ensemble donné ”, trois
techniques peuvent être utilisées. La première consiste à utiliser une jointure imbriquée avec
NOT IN. La sous-requête est utilisée pour calculer l’ensemble de recherche et le bloc de
niveau supérieur extrait les éléments n’appartenant pas à cet ensemble.
FROM PILOTE
10
(SELECT NUMPIL FROM VOL)
Une deuxième approche fait appel au prédicat NOT EXISTS qui s’applique à un bloc
imbriqué et rend la valeur vrai si le résultat de la sous-requête est vide (et faux sinon). Il faut
faire très attention à ce type de requête car NOT EXISTS ne dispense pas d’exprimer des
jointures. Ce danger est détaillé à travers l’exemple suivant.
FROM PILOTE
Il suffit qu’un vol soit créé dans la relation VOL pour que la requête précédente retourne
systématiquement un résultat vide. En effet le bloc imbriqué rendra une valeur pour NUMPIL
et le NOT EXISTS sera toujours évalué à faux, donc aucun pilote ne sera retourné par le
premier bloc.
Le problème de cette requête est que le lien entre les éléments cherchés dans les deux blocs
n’est pas spécifié. Or, il faut indiquer au système que le 2ème bloc doit être évalué pour
chacun des pilotes examinés par le 1er bloc. Pour cela, on introduit un alias pour la relation
PILOTE et une jointure est exprimée dans le 2ème bloc en utilisant cet alias. La formulation
correcte est la suivante :
FROM VOL
MINUS
❖ Classification ou partitionnement
La classification permet de regrouper les lignes d'une table dans des classes d’équivalence ou
sous-tables ayant chacune la même valeur pour la colonne de la classification. Ces classes
11
forment une partition de l'extension de la relation considérée (i.e. l’intersection des classes est
vide et leur union est égale à la relation initiale).
Exemple : considérons la relation VOL illustrée par la figure 1. Partitionner cette relation sur
l’attribut NUMPIL consiste à regrouper au sein d’une même classe tous les vols assurés par le
même pilote. NUMPIL prenant 4 valeurs distinctes, 4 classes sont introduites. Elles sont
mises en évidence dans la figure 2 et regroupent respectivement les vols des pilotes n° 100,
102, 105 et 124.
En SQL, l’opérateur de partitionnement s’exprime par la clause GROUP BY qui doit suivre
la clause WHERE (ou FROM si WHERE est absente). Sa syntaxe est :
Les colonnes indiquées dans SELECT, sauf les attributs arguments des fonctions agrégatives,
doivent être mentionnées dans GROUP BY.
En présence de la clause GROUP BY, les fonctions agrégatives s'appliquent à l'ensemble des
valeurs de chaque classe d’équivalence.
GROUP BY NUMPIL
12
Dans ce cas, le résultat de la requête comporte une ligne par numéro de pilote présent dans
la relation VOL.
Nous obtenons ici autant de lignes par pilote qu'il y a d'avions distincts conduits le pilote
considéré. Chaque classe d’équivalence créée par le GROUP BY regroupe tous les vols
ayant même pilote et même avion.
Partitionner une relation sur un attribut clé primaire est évidemment complètement inutile :
chaque classe d’équivalence est réduite à un seul tuple !
De même, mentionner un DISTINCT devant les attributs de la clause SELECT ne sert à rien
si le bloc comporte un GROUP BY : ces attributs étant aussi les attributs de partitionnement,
il n’y aura pas de duplicats parmi les valeurs ou combinaisons de valeurs retournées. Il faut
par contre faire très attention à l’argument des fonctions agrégatives. L’oubli d’un
DISTINCT peut rendre la requête fausse.
FROM VOL
GROUP BY NUMAV
Si le DISTINCT est oublié, c’est le nombre de vols qui sera compté et la requête sera fausse.
Des conditions de sélection peuvent être appliquées aux sous-tables engendrées par la clause
GROUP BY, comme c'est le cas avec la clause WHERE pour les tables. Cette sélection
s'effectue avec la clause HAVING qui doit suivre la clause GROUP BY. Sa syntaxe est :
HAVING condition
La condition permet de comparer une valeur obtenue à partir de la sous-table à une constante
ou à une autre valeur résultant d'une sous-requête.
13
GROUP BY NUMPIL
Exemple : quelles sont les villes à partir desquelles le nombre de villes desservies est le plus
grand ?
SELECT VILLE_DEP
FROM VOL
GROUP BY VILLE_DEP
FROM VOL
GROUP BY VILLE_DEP)
Même si les clauses WHERE et HAVING introduisent des conditions de sélection mais elles
sont différentes. Si la condition doit être vérifiée par chaque tuple d’une classe d’équivalence,
il faut la spécifier dans le WHERE. Si la condition doit être vérifiée globalement pour la
classe, elle doit être exprimée dans la clause HAVING.
3. Jointure
Jointure : Sélection de deux colonnes dans deux tables différentes, créant ainsi une relation entre les
données des deux colonnes.
• Objectif
▪ Afficher des données issues de plusieurs tables. Utiliser une condition appelée jointure.
▪ Une condition de jointure spécifie une relation existante entre les données d'une colonne dans
une table avec les données d'une autre colonne dans une autre table.
▪ Cette relation est souvent établie entre des colonnes définies comme clé primaire et clé
étrangère.
Syntaxe:
14
SQL langage de définition de données
1.Création de table
Pour créer une table en SQL, il existe l’instruction CREATE TABLE dans laquelle sont précisés
pour chaque colonne de la table : son intitulé, son type de donnée et une ou plusieurs contraintes.
où <contrainte> représente la liste des contraintes d'intégrité structurelles concernant les colonnes
de la table crée.
Exemple :
15
CONSTRAINT
DEFAULT
NOT NULL
UNIQUE
CHECK
✓ Contrainte du domaine
Il ne peut y avoir de comparaison entre deux valeurs d’attributs si ces derniers ne sont pas
définit sur le même domaine. Le SGBD-R se charge de vérifier la validité des valeurs
d’attributs.
Un enregistrement ne peut être inséré dans une table que si chaque champ de l’enregistrement
vérifie la contrainte d’intégrité de domaine de la colonne pour laquelle il est destiné.
Le langage SQL permet de définir une valeur par défaut lorsqu'un champ de la base n'est pas
renseigné grâce à la clause DEFAULT. Cela permet notamment de faciliter la création de
tables, ainsi que de garantir qu'un champ ne sera pas vide.
La clause DEFAULT doit être suivie par la valeur à affecter. Cette valeur peut être un des
types suivants :
Constante numérique
Le mot clé NOT NULL permet de spécifier qu'un champ doit être saisi, c'est-à-dire que le
SGBD refusera d'insérer des tuples dont un champ comportant la clause NOT NULL n'est pas
renseigné.
Il est possible de faire un test sur un champ grâce à la clause CHECK() comportant une
condition logique portant sur une valeur entre les parenthèses. Si la valeur saisie est différente
de NULL, le SGBD va effectuer un test grâce à la condition logique.
16
CHECK (attribut <condition> )
avec <condition> qui peut être une expression booléenne "simple" ou de la forme IN (liste de
valeurs) ou BETWEEN <borne inférieure> AND <borne supérieure>.
La clause UNIQUE permet de vérifier que la valeur saisie pour un champ n'existe pas déjà
dans la table. Cela permet de garantir que toutes les valeurs d'une colonne d'une table seront
différentes.
Voici un exemple permettant de voir la syntaxe d'une instruction de création de table avec
contraintes :
✓ Définition de clés
Grâce à SQL, il est possible de définir des clés, c'est-à-dire spécifier la (ou les) colonne(s)
dont la connaissance permet de désigner précisément un et un seul tuple (une ligne).
L'ensemble des colonnes faisant partie de la table en cours permettant de désigner de façon
unique un tuple est appelé clé primaire et se définit grâce à la clause PRIMARY KEY
suivie de la liste de colonnes, séparées par des virgules, entre parenthèses. Ces colonnes ne
peuvent alors plus prendre la valeur NULL et doivent être telles que deux lignes ne puissent
avoir simultanément la même combinaison de valeurs pour ces colonnes.
REFERENCES Nom_de_la_table_etrangere(colonne1,colonne2,...)
Attachée à un champ "clé étrangère" cette contrainte garantit que toute valeur prise par ce champ
appartienne à l’ensemble des valeurs de la clé primaire.
17
Il est possible de donner un nom à une contrainte grâce au mot clé CONSTRAINT suivi du
nom que l'on donne à la contrainte, de telle manière à ce que le nom donné s'affiche en cas de
non respect de l'intégrité, c'est-à-dire lorsque la clause que l'on a spécifiée n'est pas validée.
Si la clause CONSTRAINT n'est pas spécifiée, un nom sera donné arbitrairement par le
SGBD.
Toutefois, le nom donné par le SGBD risque fortement de ne pas être compréhensible, et ne
sera vraisemblablement pas compris lorsqu'il y aura une erreur d'intégrité. La stipulation de
cette clause est donc fortement conseillée.
Pour nommer les contraintes, il est d’usage de suivre la norme indiquée ci-dessous ; dans une
même base de données on ne peut pas avoir deux contraintes qui portent le même nom.
Les abréviations les plus fréquemment utilisées pour chaque type de contraintes sont :
L’option ON DELETE CASCADE permet de supprimer une ligne d’une table ainsi que toutes
les lignes liées dans une autre table.
Exemple :
(NoClient Integer,
18
Instruction Table « parent » Table « fils »
enregistrements détruits
19
L’option ON DELETE CASCADE permet de supprimer une ligne d’une table ainsi que tous les
lignes liées dans une autre table.
Exemple :
On suppose que le contenu des tables CLIENT et COMMANDE est limité aux lignes
suivantes:
CLIENT
1 DUBOIS PROFESSIONNEL
2 DELAGE PARTICULIER
3 DUPONT PROFESSIONNEL
COMMANDE
101 15/12/1999 3
20
La suppression du client Numéro 1 dans la table CLIENT pourrait :
- soit entraîner la suppression des commandes 102 et103 dans la table COMMANDE si
l’option ON DELETE CASCADE est mentionnée,
- soit entraîner la suppression de ce client et de vider le champ NoClient pour les commandes
102 et103 dans la table COMMANDE si l’option ON DELETE SET NULL est mentionnée.
<contrainte>]… );
✓ Modification :
5.Destruction de table
DROP TABLE <nom de la table>;
21
SQL langage de manipulation de données
1.Insertion de données
Pour insérer une ou plusieurs lignes dans une seule table, SQL offre l’instruction INSERT
INTO. Lorsque l’on connait directement les valeurs à insérer, on utilise l’instruction INSERT
INTO…VALUES.
On peut également insérer dans une table, le résultat d’une requête SELECT, auquel cas
plusieurs lignes peuvent être insérer à la fois.
- Les valeurs qui sont données via VALUES doivent être dans le même ordre que les colonnes
qui sont précisés dans INTO.
- si la moindre valeur insérée ne vérifie pas les contraintes d’intégrités de la table, alors
l’instruction INSERT INTO est refusée en entier par le serveur ORACLE.
- les colonnes qui figurent dans la clause SELECT doivent être compatibles en type de
données, en nombre et en ordre avec celles qui sont précisés dans la clause INTO.
Exemple :
Pour que num_client reçoie un entier qui s’incrémente automatiquement, il suffit de créer,
avant la première insertion, une séquence pour cette table.
MAXVALUE 99
START WITH 1
INCREMENT BY 1
22
2.Modification de données
Pour modifier la valeur d’une ou plusieurs colonnes, d’une ou plusieurs lignes, d’une seule
table, on utilise l’instruction UPDATE…SET…WHERE.
Exemple :
Syntaxe:
MERGE INTO table AS table_alias USING (table | vue | sous-requête) alias ON (condition de
jointure)
3.Suppression de données
Pour supprimer une ou plusieurs lignes dans une seule table, on utilise la syntaxe suivante :
✓ Attention : En cas d’omission de la clause WHERE, toutes les lignes de la table seront
supprimées. C’est équivaut à l’utilisation de la clause TRUNCATE
1.Création d'index
Pour accélérer les accès aux tuples, la création d'index peut être réalisée pour un ou plusieurs
attributs fréquemment consultés. La commande à utiliser est la suivante :
23
CREATE [UNIQUE] [NOCOMPRESS] INDEX <nom_index> ON <nom_table>
(<nom_colonne>, [nom_colonne]…) ;
Lorsque le mot-clef UNIQUE est précisé, l’attribut (ou la combinaison) indexé doit avoir des
valeurs uniques.
Une fois qu’ils ont été créés, les index sont automatiquement utilisés par le système et de
manière transparente pour l’utilisateur.
Exemple :
On considère qu’une vue est une table virtuelle car elle peut être utilisée de la même façon
qu’une relation mais ses données (redondantes par rapport à la base originale) ne sont pas
physiquement stockées. Plus précisément, une vue est définie sous forme d’une requête
d'interrogation et c’est cette requête qui est conservée dans le dictionnaire de la base.
- restreindre l'accès à certaines colonnes ou certaines lignes d'une table pour certains
utilisateurs (confidentialité) ;
Si une liste de noms d’attributs est précisée après le nom de la vue, ces noms seront ceux des
attributs de la vue. Ils correspondent, deux à deux, avec les attributs indiqués dans le
SELECT de la requête définissant la vue. Si la liste de noms n’apparaît pas, les attributs de
la vue ont le même nom que ceux attributs indiqués dans le SELECT de la requête.
Il est très important de savoir comment la vue à créer sera utilisée : consultation simplement
et/ou mises à jour.
Exemple : pour éviter que certains utilisateurs aient accès aux salaires et prime des pilotes, la
vue suivante est définie à leur intention et ils n’ont pas de droits sur la relation PILOTE.
24
AS
FROM PILOTE
Exemple : pour épargner aux utilisateurs la formulation d’une requête complexe, une vue est
définie par les développeurs pour consulter la charge horaire des pilotes. Sa définition est la
suivante :
AS
Lorsque cette vue est créée, les utilisateurs peuvent la consulter simplement par :
SELECT *
Lorsque le système évalue une requête formulée sur une vue, il combine la requête de
l’utilisateur et la requête de définition de la vue pour obtenir le résultat.
Lorsqu'une vue est utilisée pour effectuer des opérations de mise à jour, elle est soumise à des
contraintes fortes. En effet pour que les mises à jour, à travers une vue, soient
automatiquement répercutées sur la relation de base associée, il faut impérativement que :
- la vue n'ait qu'une seule relation dans la clause FROM. Ceci implique que dans une vue
multi-relation, les jointures soient exprimées de manière imbriquée.
Lorsque la requête de définition d’une vue comporte une projection sur un sous ensemble
d’attributs d’une relation, les attributs non mentionnés prendront des valeurs nulles en cas
d’insertion à travers la vue.
Exemple : définir une vue permettant de consulter les vols des pilotes habitant Bayonne et de
25
les mettre à jour.
AS
SELECT *
FROM VOL
WHERE NUMPIL IN
(SELECT NUMPIL
FROM PILOTE
La vue précédente permet la consultation uniquement des vols vérifiant la condition donnée
sur le pilote associé. Il est également possible de mettre à jour la relation VOL à travers cette
vue mais l’opération de mise à jour peut concerner n’importe quel vol (sans aucune
condition).
Par exemple supposons que le pilote n° 100 habite Paris, l’insertion suivante sera réalisée
dans la relation VOL à travers la vue, mais le tuple ne pourra pas être visible en consultant la
vue.
Si la clause WITH CHECK OPTION est présente dans l’ordre de création d’une vue, la
table associée peut être mise à jour, avec vérification des conditions présentes dans la requête
définissant la vue. La vue joue alors le rôle d'un filtre entre l'utilisateur et la table de base, ce
qui permet la vérification de toute condition et notamment des contraintes d'intégrité.
Exemple : définir une vue permettant de consulter et de les mettre à jour uniquement les vols
des pilotes habitant Bayonne.
AS
SELECT *
FROM VOL
WHERE NUMPIL IN
(SELECT NUMPIL
FROM PILOTE
26
Exemple : définir une vue sur PILOTE, permettant la vérification de la contrainte de domaine
suivante : le salaire d'un pilote est compris entre 3.000 et 5.000.
AS
SELECT *
FROM PILOTE
Exemple : définir une vue sur vol permettant de vérifier les contraintes d'intégrité
référentielle en insertion et en modification.
AS
SELECT *
FROM VOL
27
➢ La gestion des utilisateurs : à qui on associe des espaces de stockage (tablespaces)
dans lesquels se trouveront leurs objets (table, index, séquences …).
➢ La gestion des privilèges : qui permettent de donner des droits sur la base de données
(privilèges systèmes) et sur les données de la base (privilèges objets).
➢ La gestion des rôles : qui regroupent des privilèges système ou objets affectés par la
suite à un ou plusieurs utilisateurs.
Un utilisateur est identifié au niveau de la base par son nom et peut se connecter puis accéder
aux objets de la base sous réserve d’avoir reçu un certain nombre de privilèges.
Un schéma est une collection nommée (du nom de l’utilisateur qui en est en propriétaire)
d’objets (tables, vues, séquences, index, procédures, …).
Les types d’utilisateurs, leurs fonctions et leur nombre peuvent varier d’une base à une autre.
Néanmoins, pour chaque base de données en activité, on peut classifier les utilisateurs de la
manière suivante :
Seul l’utilisateur qui possède le privilège CREATE USER peut créer des utilisateurs.
REPLACE <old_password>;
28
➢ Suppression d’un utilisateur:
CASCADE suppression des objets de l’utilisateur (Nécessaire sinon de les supprimer avant).
Lorsqu'un utilisateur est créé avec l'instruction CREATE USER, il ne dispose encore d'aucun
droit car aucun privilège ne lui a encore été assigné. Il ne peut même pas se connecter à la
base. Il faut donc lui assigner les privilèges nécessaires. Il doit pouvoir se connecter, créer des
tables, des vues, des séquences.
Un privilège est un droit d’exécuter une certaine instruction SQL (on parle de privilège
système), ou un droit d’accéder à un certain objet d’un autre schéma (on parle de privilège
objet).
❖ Privilèges systèmes
Il existe une centaine de privilèges système. Par exemple la création d’utilisateurs (CREATE
USER), la création et la suppression de tables (CREATE /DROP TABLE), la création
d’espaces (CREATE TABLESPACE). Pour assigner ces privilèges de niveau système il faut
utiliser l'instruction GRANT dont voici la syntaxe :
[IDENTIFIED BY mot_passe]
[WITH ADMIN OPTION] ;
WITH ADMIN OPTION : permet d’attribuer aux bénéficiaires le droit de transmettre les
privilèges reçus à une tierce personne.
ANALYZE
29
AUDIT
CLUSTER
ALTER ANY CLUSTER Modifier tous les clusters dans la base de données.
DROP ANY CLUSTER Supprimer tous les clusters dans la base de données.
DATABASE
DATABASE LINK
INDEX
ALTER ANY INDEX Modidier tous les index dans la base de données.
DROP ANY INDEX Supprimer tous les index dans la base de données.
PRIVILEGE
PROCEDURE
30
PROFILE
CREATE PUBLIC
Créer des database links publics.
DATABASE LINK
PUBLIC SYNONYM
ROLE
ALTER ANY ROLE Modifier tous les roles dans la base de données.
DROP ANY ROLE Supprimer tous les roles dans la base de données.
GRANT ANY ROLE Grant tous les roles dans la base de données.
ROLLBACK SEGMENT
CREATE ROLLBACK
Créer des rollback segments.
SEGMENT
ALTER ROLLBACK
Modifier des rollback segments.
SEGMENT
SESSION
SEQUENCE
31
CREATE SEQUENCE crée une sequence dans son schema.
CREATE ANY SEQUENCE Créer toutes les sequences dans tous les schemas.
ALTER ANY SEQUENCE Modifier toutes les sequence dans tous les schémas.
DROP ANY SEQUENCE Supprimer toutes les sequence dans tous les schémas.
SELECT ANY SEQUENCE Reference toutes les sequence dans tous les schémas.
SNAPSHOT
ALTER SNAPSHOT Modifier tous les snapshots dans tous les schémas.
DROP ANY SNAPSHOT Supprimer tous les snapshots dans tous les schémas.
SYNONYM
CREATE SYNONYM Créer tous les synonyms dans tous les schémas.
DROP ANY SYNONYM Supprimer tous les synonyms dans tous les schémas.
SYSTEM
TABLE
CREATE TABLE Créer des tables ou des indexs dans son propre schéma
CREATE ANY TABLE Créer des tables dans tous les schémas.
32
Interroger toutes les tables, vues, ou clichés dans
SELECT ANY TABLE
tous les schémas.
TABLESPACE
TRANSACTION
TRIGGER
33
Enable, disable, ou compile toutes les trigger dans
ALTER ANY TRIGGER
tous les schémas.
DROP ANY TRIGGER Supprimer toutes les trigger dans tous les schémas.
USER
VIEW
DROP ANY VIEW Supprimer toutes les view dans tous les schémas.
Et il en va de même pour tous les autres privilèges qui lui sont assignés.
L'ensemble de ces privilèges peuvent être assignés au sein d'une même commande
nom_utilisateur ;
34
Exemple :
Hicham peut créer des tables dans son schéma et peut retransmettre ce privilège à un tiers.
Ahmed peut se connecter à la base, créer et détruire des tables dans tout schéma.
Un utilisateur d’ORACLE peut être supprimé à tout moment ou se voir démuni de certains
privilèges. La commande correspondante est :
PUBLIC : pour annuler le privilège à chaque utilisateur ayant reçu ce privilège par l’option
public.
Exemple :
Commande incorrect car Ahmed n’a pas reçu tous les privilèges système.
❖ Privilèges objets :
Les privilèges objets sont relatifs aux données de la base et aux actions sur les objets (table,
vue, séquence, procédure). Chaque type d’objet a différents privilèges associés comme
l’indique le tableau suivant : Permettent les manipulations sur des objets spécifiques. Les
privilèges SELECT, INSERT, UPDATE, DELETE.
35
Privilège table vue séquence programme PL/SQL
ALTER ×
DELETE × ×
EXECUTE ×
INDEX ×
INSERT × ×
REFERENCES ×
SELECT × × ×
UPDATE × ×
L’instruction GRANT permet d’attribuer un (ou plusieurs) privilèges à un (ou plusieurs) objet
à un (ou plusieurs) bénéficiaire. L’utilisateur qui exécute cette commande doit avoir lui-même
le droit de transmettre ces privilèges sauf s’il s’agit de ses propres objets pour lesquels il
possède automatiquement les privilèges avec l’option GRANT OPTION. La syntaxe est la
suivante :
ON SCHEMA.nomobjet
TO utilisateur | PUBLIC
[WITH GRANT OPTION]
36
WITH GRANT OPTION: permet de donner aux bénéficiaires le droit de retransmettre les
privilèges reçus à une tierce personne.
nom_utilisateur ;
Une liste de colonnes peut être indiquée dans l'instruction afin de restreindre davantage les
droits sur une table
L'utilisateur peut modifier la table SMI.ETUDIANTS mais uniquement les colonnes note et
moy.
Exemple :
ON Hicham.Pilote
TO Ahmed
Pour pouvoir révoquer un privilège objet, il faut détenir au préalable cette permission ou
avoir reçu le privilège système ANY OBJECT PRIVILEGE. Il n’est pas possible d’annuler un
privilège objet qui a été accordé avec l’option WITH GRANT OPTION.
ON objet
CASCADE : retrait des droits accordés à des tiers (ADMIN option) par celui à qui on retire le
privilège
Exemple:
37
REVOKE UPDATE(nom,age), SELECT ON Hicham.Pilote FROM Ahmed;
Ahmed ne peut plus modifier ni lire la table Pilote de l’utilisateur Hicham.
• Un utilisateur possède automatiquement tous les privilèges sur un objet qui lui
appartient.
• S'il n'a pas reçu le privilège avec l'option WITH GRANT OPTION, un utilisateur ne
peut pas assigner à son tour ce même privilège.
❖ rôles
Un Rôle permet :
➢Modification de rôle
Exemple:
39