Académique Documents
Professionnel Documents
Culture Documents
1
Jean Armand YOMBI en homage à Julien SCHNNEL
Un objet est une table ou une vue (les vues seront abordées plus
tard ; pour l’instant, tous nos exemples se rapportent à des tables).
2
Jean Armand YOMBI en homage à Julien SCHNNEL
. Une expression calculée avec des opérateurs et/ou des empno : numéro identifiant un employé
mgr : numéro du responsable (manager) direct d’un employé
fonctions appliquées à une ou plusieurs colonnes.
ename : nom d’employé
sal : salaire
Le symbole * signifie : toutes les colonnes d’une table. Si plusieurs
comm : commissions perçues (uniqsuement pour les vendeurs, les
tables sont citées dans la clause FROM, il faut préfixer le symbole
représentants)
par un nom de table (table.*).
hiredate : date d’embauche
deptno : numéro identifiant un département
t_alias est un alias (synonyme local à la requête) pour un nom de
dname : nom du département (ex : Research)
table.
loc : localisation (la ville)
c_alias permet d’associer un libellé à une expression. Ce libellé sera
utilisé pour la ligne d’entête qu’affiche à l’écran une requête SQL
(par défaut, ce sont les noms des expressions ou colonnes citées dans la clause
Premiers exemples de requêtes :
SELECT qui sont affichés).
STYLE 1 :
La clause HAVING ne peut être présente que s’il y a
aussi la clause GROUP BY. select * from emp ; affiche la table complète des employés
Exercice 1 : Demander aux étudiants de construire le diagramme Par la suite, nous employerons l’un ou l’autre style
entité-relation de cette base.
select ename «Nom»,sal «Salaire» from emp ;
3
Jean Armand YOMBI en homage à Julien SCHNNEL
La ligne d’entête affichée (avant les lignes du résultat) comportera Argument1 opérateur argument2
les libéllés Nom et Salaire au lieu de, respectivement, ename et
sal. Opérateur (de comparaison) : = != <> < <= > >=
Argument1, argument2 peuvent être des:
select job requête affichant les jobs des - constantes
employés - noms de colonnes
from emp ; si plusieurs employés ont le même job, - expressions avec des opérateurs (+, -, /, *)
celui-ci sera affiché plusieurs fois et/ou des fonctions appliquées à une (ou plusieurs)
colonne(s)
select distinct job les doublons sont ôtés (voir plus loin Expressions & fonctions)
from emp ;
De plus, argument2 peut être une requête SQL
select distinct e.ename, e.job (voir Requête Imbriquée)
from emp e ; donne une seule occurrence des (SELECT …)
employés qui ont même nom et même il est alors interprêté comme étant le résultat de cette requête.
job
colonne IS [NOT] NULL
exemple : s’il y a plusieurs (Dupont, détective), la
valeur (Dupont, détective) n’est affichée qu’une fois ; argument [NOT] IN (liste)
donc, si l’on est intéressé de savoir qu’il existe où liste est une suite de valeurs séparées par le symbole,
plusieurs, faire attention !
argument [NOT] IN (SELECT …)
• La clause WHERE (argument, argument, …) [NOT] IN (SELECT …)
Elle est suivie d’une condition, qui peut être combinée avec d’autres argument [NOT] BETWEEN valeur AND valeur
conditions en utilisant les opérateurs logiques AND et OR
argument [NOT] LIKE ‘chaîne générique’
Une condition simple ou composée peut être inversée avec
l’opérateur NOT (…). Dans la chîne (générique), le symbole % désigne toute chaîne de
caractères (y compris, la chaîne vide) et le symbole _ remplace un
Une condition peut avoir l’une des formes suivantes : caractère quelconque.
4
Jean Armand YOMBI en homage à Julien SCHNNEL
Dans les 5 dernières formes citées, argument peut être : select ename, sal + comm “Gains”
from emp
- un nom de colonne where comm is not null ;
- une expression (avec opérateurs de calcul, et/ou
fonctions) comm is not null signifie : « dont la rubrique comm est
renseignée »
Exemples
A propos de cet exemple, il faut absolument bien comprendre la
Requête donnant le nom, n° du responsable et salaire des employés distinction que fait Oracle entre la valeur null et le nombre 0.
dont le nom commence par la lettre S et dont le salaire n’est pas Un employé avec comm = 0 sera affiché par la requête ; en effet, la
compris entre 800 et 2000 (dollars). valeur de comm est connue (elle est égale à 0 !) => comm ≠ null
select el.ename, el.mgr, el.sal • La clause ORDER BY
from emp el
where el.ename like ‘S%’
Elle permet de trier les résultats suivant différentes expressions
and el.sal not between 800 and 2000 ;
(souvent, des noms de colonnes) par ordre croissant (ASC) ou
décroissant (DESC).
les opérateurs like et = ne sont pas équivalents ; la La première expression de la liste est le critère (de tri) primaire.
condition where ename=‘S%’ retiendrait les L’option ASC est prise par défaut pour chacune des expressions
employés qui s’appellent S% ! citées (voir syntaxe d’une requête SQL).
select d.dname Exemples
from dept d
where d.loc in (‘CHICAGO’,‘DALLAS’); Lister les employés par salaires décroissants.
Est équivalent à :
select d.dname from dept d select ename, sal
where d.loc =‘CHICAGO’or d.loc = ‘DALLAS’);
from emp
order by sal desc ;
Si on souhaite rechercher les gains commerciaux (c’est à dire les
employés qui perçoivent des commisions), on écrit:
5
Jean Armand YOMBI en homage à Julien SCHNNEL
Afficher les employés par N° de département décroissant (critère La sous-requête est évaluée en premier et délivre la liste des N° des
principal) et salaire croissant (critère secondaire pour départager départements localisés à Chicago. Puis, la requête principale affiche
les employés du même département). les employés dont le N° de département appartient à cette liste.
select * Quels sont les employés qui occupent le même poste que
from emp l’employé 1 ?
order by deptno desc, sal ;
select *
from emp
• Requêtes imbriquées where job = (select job
from emp
Dans la clause WHERE, les opérateurs = et IN peuvent être suivis where empno = 1) ;
d’une requête SELECT. On dit que celle-ci est imbriquée dans la
requête principale. Différence entre les opérateurs IN et =
select e.* Quels sont les employés qui ne travaillent pas dans un département
from emp e de recherche ?
where e.deptno in ( select d.deptno
from dept d select *
where d.loc =‘CHICAGO’) ; from emp
where deptno not in (select deptno
from dept
where dname=‘Research’);
6
Jean Armand YOMBI en homage à Julien SCHNNEL
Question: quel est le résultat select ename, greatest (sal, comm) from emp ;
délivré par cette requête ?
7
Jean Armand YOMBI en homage à Julien SCHNNEL
8
Jean Armand YOMBI en homage à Julien SCHNNEL
Le format par défaut d’une date est : ‘dd/mm/yy’ qui correspond à 2 select ename
chiffres pour le jour, le mois et l’année, ces champs étant séparés par from emp
le symbole / where hiredate =
Par exemple : ‘20/08/93’ to_date (‘01/10/1993’, dd/mm/yyyy’);
équivalent à :
La fonction TO_CHAR (d, format) convertit une dete ou une
expression de type date en une chaîne dont le format est précisé.
select ename
Par exemple : to_char (hiredate,‘dd/MON/yy’) -> fom emp
‘20/AOU/93’ where to_char (hiredate,‘dd/mm/yyyy’) =
To_char (hiredate,‘YYYY/MONTH/dd’)->‘1993/AOUT/20’ ‘01/10/1993’;
La fonction TO_DATE (c, format) convertit une chaîne signifiant MAX, MIN, SUM (somme), STDDEV (écart type),
une date dont le format est précisé en un objet de type date.
VARIANCE
To_date (‘86/19/07’,‘YY/DD/MM’) retourne la date du
19 juillet 1986. Sont appelées fonctions d’agrégation.
9
Jean Armand YOMBI en homage à Julien SCHNNEL
Dans une requête sans clause GROUP BY, on ne peut pas select count (distinct e.job) compte le nombre de
indiquer après SELECT à la fois des noms de colonnes et from emp e ; valeurs distinctes dans
des fonctions d’agrégation. la colonne job
Ces fonctions ne peuvent figurer qu’après les clauses select sum (sal * 1.1) calcule la somme des
from emp ; salaires majorés de 10%.
SELECT et HAVING.
select avg (sal)
Exemples from emp calcule la moyenne des
where upper (job)=‘ANALYST’ ; salaires des analystes
select min (sal),max(sal),avg (sal)
from emp ;
le plus faible et le plus fort select ename, max(sal) Requête mal construite!
salaire, et la moyenne des from emp ;
salaires
En effet, il a été indiqué précédemment qu’on ne pouvait pas
select count(*) le nombre total d’employés mélanger des colonnes et des fonctions d’agrégation après SELECT
from emp ; dans une requête sans clause GROUP BY.
10
Jean Armand YOMBI en homage à Julien SCHNNEL
Les valeurs nulles, c’est à dire non renseignées (=null), sont Par contre, sal+nvl(comm,0) vaut sal(+0) si comm=null
ignorées dans les fonctions d’agrégation. select avg(sal+nvl(comm,0) from emp ;
Ainsi : select avg(comm) from emp ; fournira la moyenne des gains perçus par l’ensemble des employés.
produit la moyenne des commissions des employés qui en perçoivent
effectivement. (ceux avec comm=null ne sont pas considérés dans Autres cas :
le calcul)
select count(*) from emp where comm >= 1000 ;
La fonction NVL(colonne, valeur) permet d’attribuer select count(*) from emp where comm < 1000 ;
temporairement, lors de l’exécution d’une requête, une valeur à une
Si on additionne le nombre d’employés retourné par la première
colonne non renseignée .
requête avec celui calculé par la deuxième, on n’obtient pas le
nombre total d’employés ! : en effet, il manque ceux dont la colonne
Exemple : select avg(nvl(comm,0))
comm est à null, qui ne satisfont à aucune des deux conditions
from emp ;
where.
Si, pour un employé, comm est différent de null, la fonction utilise
Mais les valeurs null peuvent encore réserver d’autres surprises,
la valeur de comm de cet employé, sinon la valeur 0 est prise.
ainsi que le montre la requête suivante :
On a en résultat la moyenne des commisions, tous les employés
confondus.
select *
from emp
Il faut, dans certains cas, être très attentif à la façon
where empno not in ( select mgr
dont sont traitées les valeurs null. from emp) ;
Par exemple, sal+comm vaut null si comm=null ( ∀ la valeur Cette requête est censée (mais est-elle sensée) donner en résultat la liste
de sal) des employés qui ne sont pas responsables d’un employé (rappelons
Donc, la requête que mgr indique pour un employé son supérieur hiérarchique). Or ,
select min(sal+comm) from emp ; la requête répond qu’il n’y a pas d’employé répondant à la
condition ! (no rows selected)
donnera la valeur la plus petite de sal+comm, en ne considérant Quelle en est la cause ? (accrochez-vous…)
que les employés dont la valeur de comm n’est pas à null. Certains employés n’ont pas de supérieur hiérarchique ; leur valeur
de l’attribut mgr est égale à null. Par conséquent, la sous requête
11
Jean Armand YOMBI en homage à Julien SCHNNEL
La plupart du temps, une requête joignant 2 tables est de la forme : Erreur fréquente : oubli de la condition de jointure !
select emp.* , dname
SELECT colonnes de table1 et table2 from emp, dept ;
FROM table1, table2 Condition de
WHERE colonne de table1=colonne de table2 ; jointure
12
Jean Armand YOMBI en homage à Julien SCHNNEL
ne donnerait pas le résultat escompté ; chaque employé serait joint à dept.deptno) , et qu’on n’obtient pas le département (4, NEW) ;
chaque département (= produit cartésien). en effet, il n’y a pas d’employé affecté au département 4 (on peut,
par exemple, supposer qu’il s’agit d’un département nouvellement
Contrairement à l’équi-jointure théorique (voir cours sur le modèle créé et qu’aucune affectation n’a été faite pour l’instant…).
relationnel), la colonne deptno apparaît 2 fois si on écrit :
• La jointure externe : elle permet d’ajouter au résultat de la
select emp .* , dept.* jointure normale, les lignes d’une table qui n’ont pas de
from emp , dept correspondant dans l’autre table (par exemple, les
where emp.deptno= dept.deptno ; départements sans employé).
Illustation Exemple
Résultat :
13
Jean Armand YOMBI en homage à Julien SCHNNEL
Exemple : Afficher pour chaque employé son nom, son salaire, le Contrainte : les 2 requêtes doivent avoir le même nombre de
nom de son responsable ainsi que son salaire. (Utilisation d’alias colonnes et les colonnes qui se correspondent deux par deux (col11
indispensable) et col21 par exemple) être de même type (faute de quoi, le résultat
n’a aucun sens).
select E.ename, E.sal , F.ename, F.sal On obtient en résultat :
from emp E , emp F
where E.mgr = F.empno ; . avec l’opérateur UNION : les lignes délivrées par la 1
ème
ère
requête
et celles renvoyées par la 2 requête.
E est un employé et F son responsable . avec l’opérateur INTERSECT : les lignes communes aux deux.
Exemple de requête avec plusieurs jointures : . avec l’opérateur MINUS : les lignes retournées par la 1 requête
ère
Chaque employé est joint avec son département d’affectation et avec qui ne sont pas en résultat de la 2ème.
son responsable ; on affiche son nom et son salaire, le nom du
département correspondant ainsi que le nom de son responsable. A de rares exceptions près, on peut trouver des
expressions équivalentes en utilisant (selon le cas) AND,
select El.ename, El.sal,D.dname,E2.ename OR, IN et NOT IN.
from emp E1 , emp E2 , dept D
where E1.deptno = D.deptno
select * from emp where job= SALESMAN
and El.mgr = E2.empno ; union
select * from emp where deptno in (1,3,5) ;
• Les opérateurs UNION, INTERSECT, MINUS
est équivalent à :
Les arguments de ces opérateurs sont des requêtes SELECT (ou plus
exactement : les ensembles de lignes renvoyées par ces requêtes) select * from emp
une requête where job= SALESMAN or deptno in (1,3,5) ;
SELECT col11, col12,…
FROM table1 Par contre
{ UNION INTERSECT MINUS }
une 2e requête select * from prof_titulaires
SELECT col21, col22,…
FROM table2; union select * from prof_stagiaires ;
14
Jean Armand YOMBI en homage à Julien SCHNNEL
Supposons que la table emp contienne : Il y a formation de 2 groupes : les employés du département 1
(BUSH, GORE, KENNEDY) et ceux du département 2 (CAPONE).
15
Jean Armand YOMBI en homage à Julien SCHNNEL
Le premier groupe (département 1) est retenu, car sa moyenne de select deptno, count(*)
salaires est de 10000, mais le deuxième ne vérifie pas la condition from emp
HAVING (sa moyenne est de 4000). where upper(job) = SALESMAN
and sal+nvl(comm, 0) > 8000
Résultat : (1,10000)
group by deptno
having count(*) > 2 ;
• Le nombre d’employés qui sont dans le même
département et occupent le même job. donnera pour chaque département le nombre de vendeurs dont le
salaire est supérieur à 8000 (à condition qu’il y ait dans le
select deptno , job, count (*)
département plus de 2 vendeurs dont le salaire est supérieur à
from emp
group by deptno, job ; 8000 !).
La requête
16
Jean Armand YOMBI en homage à Julien SCHNNEL
select *
Dans un tel cas, l’évaluation dans la clause SELECT est faite de la from emp
manière suivante, en 2 étapes : where deptno in (select deptno from dept
where loc = CHICAGO);
1) la fonction interne est appliquée à chaque groupe ;
ici : calcul de la moyenne des salaires par job La sous-requête
est indépendante
Une liste est produite en résultat intermédiaire
ici : la liste des moyennes (par job) Dans certains cas toutefois, la sous requête est liée à la
requête principale (on parle aussi de requêtes corrélées) ,
2) la fonction externe est appliquée à la liste obtenue ainsi que le montre l’exemple suivant :
ici : la valeur du maximum dans la liste des moyennes, c’est-
à-dire la meilleure moyenne de salaires. select *
from emp E ←
La requête suivante répond à la question : Quel est le job dont le where sal > ( select avg(sal)
salaire moyen est le meilleur ? from emp
where deptno = E.deptno) ;
select job from emp
group by job Le résultat obtenu : la liste des employés dont le salaire est supérieur
having avg (sal) = (select max (avg (sal)) à la moyenne des salaires de leur département.
from emp
group by job La sous requête n’est pas indépendante ; elle est réévaluée pour
chaque employé (E) sélectionné dans la requête principale et
ce qui revient à dire qu’on veut le job dont le salaire moyen est égal retourne la moyenne des salaires des employés qui sont dans le
au maximum dans la liste des salaires moyens des différents jobs ! même département que cet employé (E).
17
Jean Armand YOMBI en homage à Julien SCHNNEL
18
Jean Armand YOMBI en homage à Julien SCHNNEL
select EL .empno , EL . ename Dans cette dernière requête, l’alias D n’est pas indispensable,
from emp EL étant donné que les 2 requêtes n’utilisent pas la même table ;
where exists (select E2 .* on peut aussi écrire :
from emp E2
where E2.mgr = EL.empno) ;
select deptno from dept
where not exists (select * from emp
Sont affichés les employés qui sont responsables d’au moins une where deptno=dept.deptno);
personne.
La clause EXISTS renvoie : Nous conseillons toutefois (autant pour des raisons de clarté que
- la valeur vrai si la sous requête retourne au moins une d’homogénéité) l’usage systématique d’alias pour les requêtes
ligne correlées.
- faux, sinon
Exercices nos résolus
Dans l’exemple, un employé (E1) est retenu s’il existe un employé
(au moins) dont le N° de responsable est le numéro de cet employé 1) Quel résultat fournit la requête suivante ?
(E1).
select * from emp x
pour des raisons d’efficacité, on préférera, lorsque cela est where not exists(select*from emp
possible, l’expression d’une requête sous une forme non where job=X.job and
deptno=X.deptno
corrélée.
and empno !=X.empno)
Par exemple, la requête : 2) Requête (sous forme correlée) donnant le N° et nom des
départements dont tous les employés ont un salaire
select deptno from dept
(rubrique sal) supérieur à 2000. (on considérera qu’un
where deptno not in (select deptno from emp)
département sans employés vérifie la condition énoncée)
Résultat: n° des
départements Indication gratuite : raisonnez en inversant la formulation (les
Est préférable sans employés départements tels qu’il n’existe pas d’employés ayant un
salaire…) !
Question subsidiaire : donnez une solution sans utiliser de
select deptno from dept D
corrélation.
where not exists (select * from emp
where deptno = D.deptno)
19
Jean Armand YOMBI en homage à Julien SCHNNEL
20
Jean Armand YOMBI en homage à Julien SCHNNEL
21
Jean Armand YOMBI en homage à Julien SCHNNEL
22
Jean Armand YOMBI en homage à Julien SCHNNEL
• Les primitives COMMIT et ROLLBACK Les transactions sont délimitées par les commandes COMMIT et
ROOLBACK.
Elles permettent respectivement de valider (confirmer) ou défaire
(annuler) un ensemble de mises à jour effectuées dans la base. L’exemple le plus célèbre de transaction est celui de la transaction
bancaire. Une opération de virement d’une certaine somme (S) d’un
Le principe (dans une session SQL*Plus) est le suivant : compte vers un autre se décompose en 2 opérations élémentaires :
débiter un compte de la somme S, et créditer l’autre (de la même
somme, de préférence !).
(dernier) commit ou début Il n’est pas cohérent que l’une de ces 2 actions soit éxécutée sans
01 session l’autre.
02
03 La transaction, c’est : créditer un compte + Débiter l’autre compte.
Les 0i sont des opérations commit : valide 01, 02 et 03
de mise à jour (insert, 04 Ce concept de transaction est surtout utile pour la programmation
Delete, Update) 05 d’application utilisant une base de données. Nous nous contentons,
rollback : défait la
séquence 04 et 05
pour notre part, de l’utilisation en mode interactif des commandes
COMMIT et ROLLBACK (on peut, par exemple, simuler une
augmentation de salaire pour les employés d’une certaine catégorie
Actions d’un utilisateur, et voir le nouveau total des salaires qui en résulterait).
dans l’ordre chronologique
COMMIT et ROLLBACK ne concernent que les primitives
Comme on peut le constater, COMMIT valide (=rend définitives) INSERT, DELETE et UPDATE (n’espérez pas récupérer
toutes les mises à jour faites depuis le précédent COMMIT (ou le avec ROLLBACK, par exemple, une table que vous avez
début de la session) et ROLLBACK les annule. détruit par DROP !).
Le concept de transaction . Certaines commandes SQL (CREATE, ALTER, DROP,
GRANT,…) provoquent automatiquement la validation des
Une transation est une séquence atomique d’opérations (générées par Mises à jour faites précédemment.
des ordres SQL) qui fait passer la base d’un état cohérent à un autre . Incidemment, COMMIT et ROLLBACK libèrent aussi les
état cohérent.
différents verrous acquis par la transaction en cours.
Par atomique, on entend que toutes les opérations de mise à jour
Ces verrous peuvent avoir été acquis explicitement
incluses dans la transaction doivent êtres faites, ou aucune (c’est tout
(commande LOCK) ou implicitement : par ex., un UPDATE
ou rien).
23
Jean Armand YOMBI en homage à Julien SCHNNEL
verrouille en écriture les lignes modifiées et empêche un L a figure suivante présente 2 sessions parallèles, où U2 espionne
autre utilisateur de faire un UPDATE portant sur l’une inlassablement U1 (regardez à quel moment les mises à jour faites
d’entre elles. par U1 deviennent visibles à U2).
. Dans le même ordre d’idées, les mises à jour faites par un
utilisateur (disons : U) ne seront visibles à un autre utilisateur
que lorsque U aura confirmé par COMMIT.
. En cas de panne (incident matériel ou logiciel, arrêt anormal
d’un processus utilisateur), une transaction non terminée est
annulée (les mises à jour nos validées par COMMIT sont
perdues).
On peut aussi définir dans une transaction des points de contrôle
(SAVEPOINT) qui peuvent être utilisés pour annuler partiellement
une transaction.
Un savepoint est défini par un identificateur (exemple :
SAVEPOINT S) et la commande ROLLBACK TO S).
On ne peut, par contre, pas valider partiellement une transaction.
04
05
B si on fait COMMIT, on valide 01 jusqu’à
05 et le point de contrôle
S est ôté.
si on fait ROOLBACK T annule 04 et 05
et on a encore la possibilité, pour les
Action d’un utilisateur dans opérations 01, 02 et 03. de les valider
l’ordre chronologique ou de les défaire.
24
Jean Armand YOMBI en homage à Julien SCHNNEL
Etat initial
N° d’employé salaire deptno
1 8000 1
LE LANGAGE DE DEFINITION
2 10000 1 ET CONTROLE DES DONNEES
U1 Utilisateurs concurrents U2
update emp (merci pour la contribution de Georges Rosenthal à la rédaction de ce chapitre)
set sal = 1.1 * sal ;
• Gestion des tables
insert into emp
values (3, 12000, 2);
Créer une table (Format élémentaire de création d’une table)
select * from emp ; select * from emp ;
1 8000 1 1 8000 1 CREATE TABLE nom (colonne type [ NULL NOT NULL]
2 11000 1 2 10000 1 [ , colonne type [ NULL NOT NULL ]] …);
3 12000 2
commit
select * from emp La structure de la table est définie en nommant ses différentes
delete from emp where deptno=1 1 8000 1 colonnes, avec leur type; par défaut, les valeurs null sont
2 10000 1 autorisées pour une colonne.
3 12000 2
select * from emp ;
select * from emp ;
Les principaux types autorisés (sous Oracle) sont :
3 12000 2
1 8000 1 . char(n) chaîne de caractères de longueur fixe = n (avec
2 10000 1 n<=255)
3 12000 2
rollback . varchar2(n) chaîne de caractères de longueur variable
( retour à l’état de la table (maximale = n)
après le dernier commit) (varchar est actuellement un synonyme de varchar2)
select * from emp ; select * from emp ; . number entier ou réel
1
2
8000
10000
1
1
1
2
8000
10000
1
1
. number(p) entier (d’au plus p chiffres)
3 12000 2 3 12000 2 . number(p,d) décimal sur p positions en tout (séparateur décimal
compris), dont d chiffres décimaux
Chronologies des actions de U1 Chronologie des actions de U2 . date
25
Jean Armand YOMBI en homage à Julien SCHNNEL
26
Jean Armand YOMBI en homage à Julien SCHNNEL
Plusieurs colonnes de la table peuvent être affublées de la contrainte Je n’ai précisé de nom (salaire) que pour la contrainte
UNIQUE (pas de doublons dans la colonne), mais on ne spécifie relative à sal ; il est recommandé de le faire
qu’une fois PRIMARY KEY (pour l’identifiant). systématiquement.
La clause REFERENCES permet de déclarer une contrainte . contrainteTable : contrainte concernant une ou plusieurs
d’intégrité de référence. colonnes de la table.
Par exemple, toute valeur du champ deptno de la table emp (n° de
département auquel est rattaché un employé) doit exister dans le champ On retrouve, avec une légère nuance dans la syntaxe de
deptno de la table dept (n° des départements existants). REFERENCES, les mêmes clauses (sauf NULL).
Si le nom de colonne n’est pas indiqué pour la table [ { UNIQUE PRIMARY KEY } (colonne [ , colonne]…) ]
reférencée, il s’agit implicitement de la colonne de cette table [ CHECK (condition) ]
qui est déclarée PRIMARY KEY. [ FOREIGN KEY (colonne [ ,colonne]… )
REFERENCES [user.] table [ (colonne [ , colonne ]… ) ]
Create table emp [ ON DELETE CASCADE ] ]
(empno number (8), PRIMARY KEY ,
mgr number (8) , Chaque contrainte peut être précédée de la clause CONSTRAINT
ename varchar2 (20) NOT NULL UNIQUE , nonContrainte.
job varchar2 (20) NOT NULL , FOREIGN KEY signifie clé étrangère ; le groupe de colonnes
sal number (8,2)CONSTRAINT salaire citées (éventuellement une seule) est l’identifiant (PRIMARY KEY)
CHECK(sal between 2000 and 50000),
comm number (8) , d’une autre table.
hiredate date DEFAULT sysdate ,
deptno number (2) REFERENCES dept (deptno) Exemples de contrainteTable :
) ; Contrainte concernant les
2 colonnes job et comm
La contrainte sera vérifiée lors de l’ajout ou de la mise à jour d’un CONSTRAINT commJob CHECK( (comm is not null and job
employé ; en outre, toute suppression de département encore = salesman ) or (comm is null and job !=’Salesman’))
référencé par des employés sera refusée, sauf si la clause ON
DELETE CASCADE est prévue. Dans ce cas la suppression d’un PRIMARY KEY (nhotel, nordre)
département provoque la suppression (en cascade) des employés qui Pour une table de Chambre (d’hôtel) :
Identifiant composé de 2 champs : le N°
en font partie (solution radicale…). d’hôtel et le n° d’ordre (le n° inscrit sur
la porte d’une chambre).
27
Jean Armand YOMBI en homage à Julien SCHNNEL
28
Jean Armand YOMBI en homage à Julien SCHNNEL
On peut aussi créer une table (objet-relationnelle) ayant la Ne pas confondre avec CREATE SYNONYM qui donne
structure d’un type par à un objet un nom supplémentaire (alias).
CREATE TABLE nom OF type; Modifier la structure d’une table
create table adresses OF adresse_t ;
ALTER TABLE [utilisateur. ] nomTable
[ADD (colonne type [ NULL NOT NULL ] , …) ]
Supprimer, renommer une table
[MODIFY (colonne [type] [ NULL NOT NULL ] , …) ] ;
DROP TABLE [utilisateur. ] nomTable ;
Avec la clause ADD, on ajoute des colonnes à la structure de la
table ; avec modify, on modifie le type d’une (ou plusieurs) colonne
On ne peut supprimer que les tables qu’on a soi-même créés (sauf si
existante.
on dispose d’un privilège administrateur, auquel cas on peut préciser
devant le nom de la table, le nom de son créateur).
Exemples
drop table emp ;
alter table emp
modify (sal number (10,2) , job varchar2 (30) ) ;
29
Jean Armand YOMBI en homage à Julien SCHNNEL
si on souhaite conserver les actuelles valeurs de la - alter table t add (colonne…) sans indiquer not null
colonne. - Mettre à jour les valeurs dans la colonne (update)
On procède de la manière suivante (soit t le nom de la - alter table t modify (colonne … not null)
table à modifier) :
1) créer une table intermédiaire, avec les Pour supprimer une colonne (par exemple, la colonne budget
nouvelles spécifications de types qu’on vient d’ajouter précédemment) :
2) copier les données de t dans intermédiaire
(insert) 1) create table departement as
3) détruite t (drop) select deptno, dname, loc
from dept ; on omet la colonne budget
4) renommer intermédiaire en t (rename)
alter table emp
2) drop table dept dans la clause Select
3) rename departement to dept
modify (job null)
supprime la spécification not null
pour la colonne job ; les valeurs Réarranger l’ordre des colonnes d’une table, et les renommer
null y sont maintenant autorisées
1) create table service (nom, ville, numero)
as select dname, loc deptno from dept ;
Pour l’opération inverse (contrainte une colonne à not 2) et 3) : même principe que précédemment
null) : pas de problème si la table est vide ; sinon, la
colonne ne doit, évidemment, pas comporter . Pour ajouter ou supprimer des contraintes, on utilise aussi la
actuellement de valeur =null. commande ALTER TABLE.
alter table dept
ALTER TABLE table
add (budget number(6) ) ; ajout de la colonne
budget à la table
[ ADD ( {descriptionColonne contrainteTable }…) ]
dept (toutes les [MODIFY (descriptionColonne …) ]
valeurs de ce champ [DROP contrainte]
sont automatique- [ {ENABLE DISABLE } contrainte ] ;
ment mises à null)
En plus de l’ajout de nouvelles colonnes (avec, éventuellement, des
On ne peut créer un nouveau champ avec l’indication contraintes) à une table et la modification de colonnes existantes, la
not null que lorsque la table est vide ; si tel n’est pas commande offre les possibilités d’ajout de contraintes, de
le cas, procéder en 3 étapes : suppression, (définitive par DROP), d’inhibition de contraintes (mise
hors service provisoire) et d’activation (réactivation).
30
Jean Armand YOMBI en homage à Julien SCHNNEL
31
Jean Armand YOMBI en homage à Julien SCHNNEL
Pour l’utilisateur, l’écriture des requêtes est La clause ORDER BY n’est pas autorisée dans la requête
indépendante des index ! Il est souvent utile d’indexer associée par défaut, la vue hérite des noms de colonne de
les colonnes de jointure (deptno de emp et deptno la requête.
de dept) ; les requêtes joignant 2 tables y gagnent en
performance. Une vue est une table virtuelle (en ce sens qu’elle n’est pas un
récipient de données) définie, grâce à la requête SQL qui lui est
Evitez toutefois de créer des index à tort et à travers ; il associée, à partir des tables, voire d’autres vues.
n’est, par exemple, pas utile d’indexer la colonne job si
80% des employés ont le job de Salesman !! Elle peut être manipulée (avec quelques restrictions toutefois) par les
La colonne doit être discriminante. utilisateurs, comme s’il s’agissait d’une table.
D’un point de vue structure interne : l’index contient une entrée pour La définition de la vue est cataloguée dans le dictionnaire de
chaque valeur de la colonne indexée, et y associe l’adresse de la (les) données ; chaque fois qu’une requête invoque cette vue, Oracle
ligne(s) qui a (ont) cette valeur de la colonne ; il est organisé en arbre accède au dictionnaire pour lancer l’exécution de la requête liée à la
hiérarchisé équilibré (B-Tree). vue.
Cf U.V. de structures
de données Exemple
Suppression d’index create view personnel
as select empno, ename, job, dname, loc
DROP INDEX nomIndex ; from emp, dept
where emp.deptno = dept.deptno ; la définition de personnel
drop index Iemp_deptno ; est stockée dans le
dictionnaire ; la requête
La suppression d’une table provoque la suppression des index select * from personnel ; select ne s’exécute pas !
rattachés à celle-ci.
invoque la vue définie précédemment ; Oracle en recherche la
• Les tables virtuelles, ou vues définition et lance, en réalité, la requête :
Créer une vue
select empno, ename, job, dname, loc
CREATE VIEW nomVue [ (colonne [ ,colonne] … ) ] from emp, dept
AS Requête where emp.deptno = dept.deptno ;
[WITH CHECK OPTION] ;
32
Jean Armand YOMBI en homage à Julien SCHNNEL
. Plus généralement, une requête initiale (R) portant sur une vue est - La commande GRANT, que nous verrons d’ici peu -patience, que
transformée par l’interpréteur en une requête qui est la diable… -permet de donner aux utilisateurs des droits d’accès sur des
combinaison de R et de la requête associée à la vue (tâche parfois tables ou vues ; notez dès à présent que, par défaut, seul le créateur d’un
assez difficile …). objet possède des droits sur celui-ci.
select * from personnel where ename like ‘S%’ ;
devient: Ainsi, la vue personnel masque aux utilisateurs ayant reçu le
droit de consulter personnel (et pas les tables réelles emp et
select empno, ename, job, dname, loc dept) les colonnes sal et comm, entre autres. En outre, les
fom emp, dept
were emp.deptno = dept.deptno and ename like S% ; utilisateurs en question ignorent que les informations proviennent de
2 tables distinctes qui sont jointes lors de la consultation de
select loc, count (*) from personnel personnel.
where lower (job) = ‘salesman’ Ce qui nous amène tout naturellement au 3ème intérêt des vues…
group by loc ;
select loc, count (*) from emp, dept Les programmes d’application utilisant des vues sont (en partie)
where emp.deptno = dept.deptno and lower (job) = immunisés contre les modifications de la structure de la base ; si une
‘salesman’ table ou une colonne change de nom, il suffit de faire des retouches
group by loc ; dans les définitions des vues dépendantes.
Intérêt des vues Grâce aux vues, des utilisateurs différents peuvent avoir des visions
différentes de la même base de données (schémas externes) ; les
facilitent l’écriture de requêtes complexes (le problème peut mêmes données peuvent être présentées selon diverses perspectives ;
être décomposé en créant une vue pour une partie de la la vue personnel, par exemple, présente les données des tables
requête). emp et dept sous une forme assemblée.
la gestion de la confidentialité (des données)
La vue qui suit présente une colonne qui est, en réalité, le résultat
C’est la vocation première des vues. d’un calcul :
Une vue permet de cacher à certains utilisateurs des données create view moyennes (num_dept, moysal)
as select e.deptno, avg (e.sal) ,
sensibles ; il suffit, pour cela, de leur autoriser l’accès aux vues, mais
from emp e
pas aux tables réelles. group by e.deptno ; colonne calculée = avg (sal)
33
Jean Armand YOMBI en homage à Julien SCHNNEL
La requête: select num_dept, moysal from moyennes ; A partir de la version 7, il vaut, bien entendu, mieux
déclenchera le calcul de avg (sal) pour chaque département. préciser ces deux contraintes directement dans CREATE
TABLE.
La vérification des contraintes d’intégrité
Mises à jour des tables au travers des vues
Jusqu’à la V6, la création des vues assorties de la mention WITH
CHECK OPTION était le seul moyen de vérifier des contraintes La mise à jour d’une vue (par INSERT, UPDATE, DELETE)
d’intégrité (c’est un devenu un peu obsolète). consiste, en réalité, à mettre à jour la table sur laquelle elle est
La clause WITH CHECH OPTION permet de contrôler et rejeter des définie.
mises à jour ne respectant pas la condition énoncée dans la clause
WHERE (de la requête associée à la vue). Il fallait, par conséquent, Toutefois, la mise à jour d’une vue est soumise aux restrictions
donner aux utilisateurs les droits de mise à jour (insert,…) sur la suivantes :
vue (au lieu de la table réelle).
. la vue doit être définie à partir d’une seule table, et la requête
Exemple de vue de contrainte. associée ne pas comporter de clause GROUP BY, ni la mention
DISTINCT pour une colonne citée dans SELECT.
create view good_emp
as select * from emp . pour utiliser UPDATE ou INSERT, la clause SELECT de la
where deptno in (select deptno from dept) requête associée à la vue ne doit pas mentionner d’expression
and ( job = Salesman or comm is null) calculée comme, par exemple, sal+comm.
with check option ;
Job ≠ ‘Salesman’ comm is null
a b est traduit sous la forme a ou b
. pour que INSERT n’échoue pas, toutes les colonnes de la table
à partir de laquelle la vue est définie) qui ont été déclarées not
null doivent figurer dans la vue.
Les employés créés (ou mis à jour) au travers de la vue good_emp
doivent vérifier les conditions énoncées dans where, c’est à dire : le
L’inconvénient des mises à jour au travers de vues (avec clause With
n° de département doit exister dans la table dept (intégrité de Check Option) réside dans la non convivialité du message d’erreur,
référence) et les employés qui ne sont pas vendeurs ont une suite à la violation de l’une des contraintes (on reçoit en pleine poire
commission à null. quelque chose comme : ORA-1402 : VIEW WITH CHECK
OPTION WHERE-CLAUSE VIOLATION… et débrouillez-vous
avec ça ! ).
34
Jean Armand YOMBI en homage à Julien SCHNNEL
Un autre inconvénient ( plus général) des vues est qu’elles La commande sert aussi bien à créer un nouvel utilisateur (option
ralentissent sensiblement les opérations de consultation et de mise à CONNECT obligatoire + éventuellement RESOURCE et/ou DBA)
jour des données. qu’à étendre des privilèges ou modifier le mot de passe initial.
La seule utilisation possible de la commande pour un utilisateur ne
Supprimer une vue disposant pas du droit DBA (database administrator) est la
modification de son mot de passe.
DROP VIEW nomVue ;
Le privilège (un rôle en fait !) CONNECT autorise un utilisateur à :
La suppression d’une table n’engendre pas automatiquement la
suppression des vues où cette table intervient; il faut faire le ménage . se connecter à la base en appelant l’un des outils Oracle (SQL*
soi-même. Plus, par ex.)
. changer son mot de passe
• La gestion des privilèges
. manipuler les objets (tables, vues) de la base si des droits
On distingue deux catégories de privilèges : les privilèges de type (select,insert, …) lui ont été accordés par les
système (gérés par un administrateur de la base) et les privilèges vis propriétaires des objets.
à vis des objets créés (accordés par les propriétaires de ces objets).
. transmettre des autorisations sur des objets s’il a obtenu le droit
de retransmettre.
Nous nous intéressons essentiellement aux privilèges de type objet,
la première catégorie relevant davantage de l’administration. . créer des vues et des synonymes (nous en parlons d’ici peu ) pour
des objets autorisés.
Les privilèges système
Par exemple, pour pouvoir créer une vue, il faut avoir reçu le droit
En principe réservés aux administrateurs, ils permettent de select sur les tables mises en jeu.
créer/modifier des objets essentiels de la base (tables, profils,
triggers,…). Un tel utilisateur ne peut, par contre, pas créer de table ni d’index.
35
Jean Armand YOMBI en homage à Julien SCHNNEL
Le rôle DBA permet de créer des utilisateurs, de donner (ou retirer) DROP ANY ROLE DROP ANY SEQUENCE
DROP ANY SNAPSHOT DROP ANY SYNONYM
des privilèges aux utilisateurs, d’accéder à tous les objets de base, de
créer des synonymes publics et d’effectuer les opérations de DROP ANY TABLE DROP ANY TRIGGER
maintenance de la base. DROP ANY VIEW DROP PROFILE
DROP PUBLIC DATABASE LINK DROP PUBLIC SYNONYM
DROP ROLLBACK SEGMENT DROP TABLESPACE
Liste des privilèges Système (inutile de les apprendre par cœur) DROP USER
EXECUTE ANY PROCEDURE
ALTER ANY CLUSTER ALTER ANY INDEX FORCE ANY TRANSACTION forcer commit/rollback sur toute transaction
FORCE TRANSACTION
ALTER ANY PROCEDURE ALTER ANY ROLE GRANT ANY PRIVILEGE GRANT ANY ROLE
ALTER ANY SEQUENCE ALTER ANY SNAPSHOT INSERT ANY TABLE LOCK ANY TABLE
ALTER ANY TABLE ALTER ANY TRIGGER MANAGE TABLESPACE mettre online/offline, oubegin/end backup de
ALTER ANY DATABASE ALTER PROFILE tablespace
ALTER RESOURCE COST ALTER ROLLBACK SEGMENT READUP autoriser des requêtes sur des données de
ALTER SESSION ALTER SYSTEM classe supérieure à la classe de la session
ALTER TABLESPACE ALTER USER RESTRICTED SESSION autoriser connexion à une base démarrée en
ANALYZE ANY analyser toute table, tout cluster, tout index RESTRICT
AUDIT ANY auditer tout objet avec les cdes AUDIT SELECT ANY SEQUENCE SELECT ANY TABLE
AUDIT SYSTEM auditer tout le système UNLIMITED TABLESPACE utiliser sans restriction tout tablespace
BACKUP ANY TABLE exporter tout table de tout utilisateur UPDATE ANY TABLE
BECOME USER devenir un autre utilisateur (pour importer une WRITEDOWN opérer sur des objets de classe inférieure
base) WRITE UP opérer sur des objets de classe supérieure
COMMENT ANY TABLE commenter toute table, vue ou colonne
CREATE ANY CLUSTER CREATE ANY INDEX La commande REVOKE permet de supprimer partiellement ou
CREATE ANY PROCEDURE CREATE ANY SEQUENCE totalement des privilèges accordés.
CREATE ANY SNAPSHOT CREATE ANY SYNONYM
CREATE ANY TABLE CREATE ANY TRIGGER
CREATE ANY VIEW REVOKE { priv-syst rôle } [, { priv -syst rôle } ] …
CREATE ANY CLUSTER FROM { utilisateur rôle PUBLIC } [, { utilisateur rôle PUBLIC } ]… ;
CREATE DATABASE LINK CREATE PROCEDURE
CREATE PROFILE CREATE PUBLIC DATABASE LINK Exemples
CREATE PUBLIC SYNONYM CREATE ROLE
CREATE ROLLBACK SEGMENT CREATE SEQUENCE
CREATE SESSION autoriser la connexion à la base grant connect to raffarin identified by ump ;
CREATE SNAPSHOT
CREATE SYNONYM CREATE TABLE création (par un dba nécessairement)
CREATE TABLESPACE CREATE TRIGGER de l’utilisateur raffarin, avec un
CREATE USER CREATE VIEW
DELETE ANY TABLE supprimer des lignes de toute table ou vue mot de passe.
DROP ANY CLUSTER
DROP ANY INDEX DROP ANY PROCEDURE
36
Jean Armand YOMBI en homage à Julien SCHNNEL
37
Jean Armand YOMBI en homage à Julien SCHNNEL
En transmettant un droit avec l’option WITH GRANT OPTION, Quand bien même un utilisateur a bénéficié d’un droit
l’heureux bénéficiaire peut, à son tour, le transmettre à un autre sur un objet, il doit, par défaut, en indiquer le
utilisateur, mais pas à un rôle (rassurez-vous, ce n’est pas contagieux…). propriétaire (en préfixant le nom de l’objet par le nom
du propriétaire.objet).
Exemples
Si, par ex., chirac transmet à juppe le droit select pour une
grant all on emp to jules with grant option ; table de nom cadeau, celui-ci doit écrire : select * from
grant select, update (sal, comm) on emp to jim ; chirac.cadeau ;
Toutefois, ceci peut être évité par l’emploi de synonymes.
. La reprise de droits est ordonnée par la commande REVOKE.
CREATE [PUBLIC ] SYNONYM [utilisateur. ] nomSynonyme
REVOKE { droit [ , droit ] … ALL } FOR [ utilisateur.] Objet ;
ON [ utilisateur. ] objet
FROM { utilisateur rôle [ , utilisateur rôle ]… PUBLIC } ; Si le nom d’utilisateur est omis (dans la clause FOR), l’objet (table
ou vue) doit appartenir à l’utilisateur créant le synonyme.
Revoke insert on emp from dupont ; Seuls les utilisateurs de type DBA sont habilités à définir des
synonymes PUBLIC ; en outre, ils peuvent créer un synonyme pour
La clause FROM PUBLIC reprend les privilèges qui avaient un utilisateur donné (en indiquant son identité avant le nom du
été donnés à PUBLIC (GRANT … TO PUBLIC), mais ne synonyme).
reprend pas les privilèges qui avaient été accordés sur cet objet Les autres utilisateurs ne peuvent créer que des synonymes à usage
individuellement (c’est à dire: en nommant un utilisateur)!! privé.
grant select on dept to durand, dupont; Il y a plusieurs façons de régler le problème de juppe (supposé non
grant select on dept to public ; DBA) :
Tous les utilisateurs
(actuels et futurs) peuvent
lire dept
. l’utilisateur juppe crée lui-même le synonyme
create synonym cadeau for chirac.cadeau ;
revoke select on dept from public ; Dans les 2 cas, le synonyme
est réservé à juppe
durand et dupont conservent
ce droit !! . un utilisateur DBA s’y colle
create synonym juppe.cadeau for chirac.cadeau ;
38
Jean Armand YOMBI en homage à Julien SCHNNEL
Hypothèse : chirac, propriétaire de emp et dept, est aux raffarin bénéficie à présent de privilèges select, update sur
manœuvres dept et de la possiblité de transmettre ceux-ci à d’autres
utilisateurs.
grant select on dept mélanie &richard
to griffith, gere ; raffarin ne se fait pas prier et propage…
39
Jean Armand YOMBI en homage à Julien SCHNNEL
grant select , update on chirac.dept to basinger ; La contrainte (job=’Salesman’ or comm is null) est violée
grant select on chirac.dept to pitt with grant option ;
et sharon stone va devoir faire face au terrible: “ORA-01402:
(comme nous l’avons indiqué précédemment, l’utilisation d’un
VIEW WITH CHECK OPTIO WHERE-CLAUSE VIOLATION” !!
synonyme pour chirac.dept faciliterait la lourde tâche de
raffarin) . Un exemple de vue variable (en fonction de l’identité de
l’utilisateur), accessible en lecture à tout le monde.
grant select, update (sal,comm)
on emp to kidman create view homonymes (nom, deptno, job)
as select ename,eptno,job from emp
create view gains (nom, date_embauche, salaire) where upper(ename)= upper (user); user = nom de l’utilisateur courant
as selecr ename, hiredate, sal from emp
where job= ‘Manager’ ; grant select on homonymes to public ;
grant select on gains to nicholson ; Explication: un utilisateur consultant la vue homonymes verra le nom
(à titre de vérification), le n° de département et le job des employés
Remarque : il est préférable de qui portent le même nom que lui.
Tous les utilisateurs (comptes Oracle) peuvent consulter
. Exemple de vue avec contrainte spécifier les contraintes directement
homonymes ; mais ceux dont le nom ne correspond pas à un nom
lors du CREATE TABLE
create view good_emp d’employé ne verront rien (no rows selected).
as select * from emp
where deptno in (select deptno from dept) Les tables du dictionnaire de données (en réalité, des
and ( job= Salesman or comm is null) vues) sont construites sur ceprincipe.
with check option ; exemple : user_tables, qui done la liste des tables
créées par un utilisateur ; user_tables est une vue
grant select, select, update on good_emp to stone ;
variable.
instructions écrités par
l’utilisateur stone (sharon) Le concept de ROLE
create synonym bon_employe for chirac.good_emp ; Jusqu’à présent, nous n’avons vu que la notion d’utilisateur ; il
insert into bon_employe existe en plus le concept de rôle.
values(66,1,Schnell,PDG,20000,30000,2,’16-JUL-97’);
40
Jean Armand YOMBI en homage à Julien SCHNNEL
de gestion des droits d’accès aux objetts (voir exemple plus loin pour 2) Maintenant, nous créons et utilisons un rôle :
s’en convaincre).
create role premierMinistre identified by matignon ;
On peut fabriquer un rôle avec la commande :
Donner des droits
grant all on emp to premierMinistre ; à un rôle
CREATE ROLE nomRole grant insert on dept to premierMinistre;
[NOT IDENTIFIED IDENTIFIED BY motDePasse] ; grant select,update on dept to premierMinistre with grant
option ;
(à condition d’avoir le droit de créer des rôles !)
grant premierMinistre to jospin;
La commande GRANT supporte :
revoke premierMinistre from jospin ; Donner un rôle à un utilisateur
. la transmission de privilèges à des utilisateurs (là, nous sommes l’utilisateur hérite des droits
terrain connu…) grant premierMinistre to raffarin attachés rôle premierMinistre
. la transmission de privilèges à des rôles Dans une session, un utilisateur peut activer (interpréter comme au
. l’attribution d’un rôle à un utilisateur cinéma) un rôle donné (à condition de connaître le mot de passe
éventuel de ce rôle).
. l’attribution d’un rôle à un rôle ! (et la bouche est bouclée…)
SET ROLE { rôle [ IDENTIFIED BY mot-de-passe]
Exemples
[ , rôle [ IDENTIFIED BY mot-de-passe] ]…
1) Sans définir de rôle : all [ EXCEPT rôle [, rôle]…] NONE } ;
grant all on emp to jospin ; L’instruction permet aussi de demander l’activation de tous les rôles
grant insert on dept to jospin;
grant select,update on dept to jospin with grant
à l’exception de certains ; on peut également souhaiter ne jouer
option; aucun rôle (dommage…) ou se libérer d’un (ou plusieurs) rôles.
revoke all on emp from jospin;
revoke all on dept from jospin; on donne à raffarin les mêmes La suppression d’un rôle s’effectue par :
droits qu’à jospin (avant qu’on
n’ait enlevé à ce dernier ses droits)
grant all on emp to raffarin ;
DROP ROLE rôle ;
grant insert on dept to raffarin;
grant select,update on dept to raffarin with grant Les rôles système CONNECT, RESOURCE, DBA sont
option; des rôles prédéfinis assurant la comptabilité avec les
privilèges systèmes antérieurs (à la V7).
41
Jean Armand YOMBI en homage à Julien SCHNNEL
Les utilisateurs
42
Jean Armand YOMBI en homage à Julien SCHNNEL
Exemple :
Le Dictionnaire de Données USER_TABLES : tables m’appartenant
ALL_TABLES : tables qui me sont accessibles
DBA_TABLES : toutes les tables de la base
Le dictionnaire est un ensemble de tables ou vues qui rassemblent
toutes les informations sur les objets de la base, par exemple : La liste qui suit indique les principales vues ; util peut être remplacé
• Les noms des utilisateurs d’Oracle par l’un des préfixes précédents.
• Les privilèges accordés Sont portés entre parenthèses les noms de colonnes de la vue.
• Les caractéristiques de tous les objets : tables, vues, index,
clusters, synonymes et séquences Remarque : le nom du propriétaire d’un objet (owner) n’est
• Les clés primaires et les clés étrangères évidemment pas cité dans les vues USER_xxxx.
• Les contraintes imposées aux tables
util_CATALOG : liste des tables, vues synonymes et séquences
• Les informations sur les espaces physiques allouées aux
(owner, table_name, table_type)
objets, l’audit (sécurité et performance),…
util_COMMENTS: commentaires associés aux colonnes
(owner, table_name, colum_name, comments)
Le dictionnaire, qui est organisé comme une base de données
util_CONSTRAINTS : liste des contraintes sur les tables
« interne » est géré dynamiquement par le noyau d’Oracle. Les
(owner, constraint-name, constraint-type, table_name,
objets qu’il contient appartiennentà l’utilisateur SYS. search_condition, r-owner, r-constraint_name)
Il peut être consulté par les utilisateurs au travers de vues util_INDEXES : liste des index sur les tables et clusters
particulières, la vue dictionnary fournissant elle, la liste (owner, index_name, table_owner, table_name, table_type,
complète des objets constituant le dictionnaire : uniqueness, tablespace_name, ini_trans…)
select * from dictionnary ;
util_OBJECTS : liste des objets
(owner, object_name, object_id, object_type, created,
Structure du dictionnaire modified)
util_SYNONYMS : liste des synonymes
Il est formé de quatre classes de vues. Les trois premières (owner, synonym_name, table_owner, table_name, db_link)
rassemblent des vues de noms identiques, au préfixe près, ce dernier util_TABLES : liste des tables
indiquant la nature des objets concernés par la vue. Ce peut être : (owner, table_name, tablespace_name, cluster_name, …)
util_TAB_PRIVS : liste des privilèges
USER_ : la vue porte sur les objets propriétés de l’utilisateur (grantee, owner, table_name, grantor, select_priv, insert_priv,
ALL_ : la vue porte sur les objets accessibles à l’utilisateur delete_priv,update_priv, references_priv, alter_priv,
DBA_ : la vue porte sur tous les objets (nécessite le privilège DBA). index_ priv, created)
43
Jean Armand YOMBI en homage à Julien SCHNNEL
44
Jean Armand YOMBI en homage à Julien SCHNNEL
create public synonym devinette for my_department ; revoke insert, update on emp from public ;
voir exemple : les utilisateurs n’ont plus, sur emp, que le droit
select, obelix conserve les droits qu’il a obtenu personnellement
en
45
Jean Armand YOMBI en homage à Julien SCHNNEL
grant select, update (sal, comm) selec e. * r1 = restrict (dept, loc= CHICAGO)
on emp to bonemine ; from emp e r2 = proj ( r1, {deptno} )
where e.deptno in resultat = join (emp, r2, emp.deptno=
create role chefs identified by gaule; r2.deptno)
(select d.deptno
from dept d
grant all on emp to chefs; where d.loc =‘CHICAGO’);
grant insert on dept to chefs;
grant select, update on dept to chefs with grant select dname from dept r1 = restrict (emp, empno=66)
option ; where deptno in r2 = proj (r1, {job} )
(select deptno from emp r3 = join (emp, r2, emp.job=r2.job)
Donner des droits à un rôle where job = r4 = proj (r3, {deptno} )
( select job from emp r5 = join (r4, dept, r4.deptno=
grant chefs to obelix ; dept.deptno)
revoke chefs from obelix; where empno=66 ) ) ; resultat = proj (r5, {dname})
46
Jean Armand YOMBI en homage à Julien SCHNNEL
47