Académique Documents
Professionnel Documents
Culture Documents
Département informatique
Bases de Données
Sylvain BRANDEL
e-mail : brandel@dpt-info.u-strasbg.fr
Chapitre 1 : BD et SGBD..................................................................................................................................... 3
I. Introduction ..................................................................................................................................................... 3
II. Analyse........................................................................................................................................................... 3
III. Bases de données .......................................................................................................................................... 4
IV. Système de Gestion des Bases de Données (SGBD) .................................................................................... 4
Chapitre 2 : Modèles............................................................................................................................................ 9
I. Le modèle relationnel ...................................................................................................................................... 9
II. Le modèle Entités / Associations.................................................................................................................. 22
Chapitre 3 : Les Schémas................................................................................................................................. 29
I. Le schéma conceptuel.................................................................................................................................... 29
II. Schémas logiques ......................................................................................................................................... 40
III. Schéma physique......................................................................................................................................... 43
Chapitre 4 : Robustesse.................................................................................................................................... 51
I. Sécurité .......................................................................................................................................................... 51
II. Confidentialité .............................................................................................................................................. 55
III. Intégrité ....................................................................................................................................................... 57
IV. Performances .............................................................................................................................................. 57
Chapitre 5 : Annexe – syntaxe des commandes ........................................................................................... 59
I. Langage d'interrogation des données ............................................................................................................. 59
II. Langage de définition de données ................................................................................................................ 61
III. Langage de manipulation de données ......................................................................................................... 64
IV. Schéma logique........................................................................................................................................... 64
V. Schéma physique.......................................................................................................................................... 65
VI. Langage de contrôle des transactions.......................................................................................................... 66
VII. Confidentialité ........................................................................................................................................... 66
I. Introduction
Une Base de données (BD ou DB) est un ensemble de données modélisant les objets d'une partie du monde réel
et servant de support à une application informatique.
Une BD est donc un ensemble structuré permettant l'extraction d'informations de manière sélective par plusieurs
utilisateurs.
Un Système de gestion de bases de données (SGBD) est un logiciel permettant d’interagir avec une BD.
II. Analyse
Avant de penser BD, il convient de poser des questions, étudier, analyser les besoins, afin de récolter les
informations (sous forme d'interview en langage "humain") nécessaires à la conception de la BD. La méthode
d'analyse la plus complète est MERISE.
Les grosses applications (banques, VPC…) sont souvent composées d'applications non coordonnées (redondance
élevée, nombreux synonymes, interfaces multiples, difficultés de MAJ), et sont généralement "touffues" (astuces
de programmes, GOTO, optimisations ponctuelles, absence de dossier). Enfin l'absence de concertation peut
conduire à des résultats différents des souhaits.
MERISE est une méthode globale et intégrée, qui permet de repenser l'organisation actuelle en terme de SAI
(Système d'Automatisation de l'Information), et d'intégrer différents utilisateurs.
Une des caractéristiques principales de MERISE est la séparation données / traitements : les analyses sont
conduites séparément puis confrontées. Il s'agit d'une démarche opposée à la philosophie "objet".
3 niveaux de modélisation, classés par ordre d'invariance décroissant (plus le niveau est élevé, et plus le système
est stable) :
• niveau conceptuel
• niveau organisationnel
• niveau technique
Le niveau conceptuel répond à la question "QUOI ?" : que faire ? avec quelles données ? Il comporte le modèle
conceptuel des données (MCD), qui représente l'aspect statique du Système d'Information sous forme de schéma
entité / associations, et le modèle conceptuel des traitements (MCT), qui prend en compte les évènements
externes et internes.
Le niveau organisationnel répond aux questions "QUI, QUAND, OU ?". Il comporte le modèle logique des
données (MLD), qui est la "représentation du MCD en fonction de l'état de l'art technologique" (Tardieu), et le
modèle organisationnel des traitements (MOT), qui permet de modéliser les notions de temps et de durée, les
postes et leur responsabilités, ainsi que les lieux et leurs ressources.
Le niveau technique répond à la question "COMMENT ?", en intégrant les moyens techniques, matériels et
logiciels. Il comporte le modèle physique des données (MPhD), qui propose une solution technique optimale
pour l'implantation physique des données et la description de leurs liens, et le modèle opérationnel des
traitements (MOpT), qui intègre les contraintes techniques dans l'organisation des traitements.
MERISE comporte de nombreux inconvénients : il nécessite de produire beaucoup de documents, est lourd pour
des petites applications. Par rapport aux étudiants, il est lourd sur les exemples pédagogiques et procure un
sentiment de flou : haut niveau d'abstraction, et méthodologie rigoureuse mais non déterministe (possibilité de
production de différents algorithmes).
A. Historique
4 générations. Le début se situe vers 1965 avec le programme Apollo d'IBM.
La 1ère génération (fin des années 60) comporte les modèles réseau ou hiérarchique, organisés autour de types
d'articles constituant les nœuds d'un graphe, les arcs étant des types de pointeurs. Les SGBD de la 1ère génération
sont, par exemple, TOTAL, IDMS.
Dans les modèles hiérarchiques, les données sont représentées sous forme d’une structure arborescente
d’enregistrements. Cette structure est conçue avec des pointeurs et détermine les chemins d’accès aux données.
La structure de donnée est facile à comprendre et les chemins d'accès sont fixes, il y a donc peu de commandes.
Par contre, l'organisation est non naturelle, le contrôle de cohérence est délicat, et la recherche est coûteuse, à
cause de l'unicité du chemin d'accès.
Dans les modèles réseau, la structure peut être visualisée sous forme d’un graphe quelconque. Comme pour le
modèle hiérarchique, la structure est conçue avec des pointeurs et détermine le chemin d’accès aux données. Ce
modèle est moins restrictif, les liaisons sont représentées de manière plus naturelle, et il y a moins de
redondances. Par contre il n'y a pas d'indépendance vis-à-vis des stratégies d'accès.
Dans ces deux modèles, les programmes ne sont pas indépendants de la structure logique de la base et du chemin
d’accès aux données : ils doivent décrire comment retrouver les données (on parle de navigation dans la base) et
si, par exemple, on enlève un index, tous les programmes qui l’utilisaient doivent être réécrits. De plus, le
langage de travail est complexe.
La 2ème génération (fin des années 70) marque le début du modèle relationnel, en partant de la théorie des
ensembles en mathématiques. Les données sont présentées aux utilisateurs sous forme de relations entre
domaines de valeurs, simplement représentées par des tables, et non plus les pointeurs qui figeaient la structure
de la base. Les recherches et mises à jour sont effectuées à l'aide d'un langage non procédural standardisé : SQL
(Structured Query Language), permettant de traduire les requêtes du langage courant. Les SGBD de la 2ème
génération représentent l'essentiel du marché actuel et sont, par exemple, ORACLE, SYBASE, INFORMIX,
DBASE, SQL SERVER.
Les structures de données complexes sont éclatées par le modèle relationnel et la reconstruction de la structure
nécessite des opérations (jointures) coûteuses en performances. Pour y palier, les systèmes de la 3ème génération
(fin des années 80), proposent des extensions objet des systèmes relationnels. Ce sont, par exemple, ORACLE 8,
DB2 Universal Database, Informix Universal Server.
Les données et les programmes sont structurés conjointement en types : les données sont enregistrées avec les
procédures qui permettent de les manipuler. Il est de plus possible de définir des sous-types par héritage.
Enfin, la 4ème génération (années 90 et actuellement), qui est plus une extension de la 3ème génération que
vraiment une nouvelle génération, permet de mieux supporter Internet et le Web, les informations mal
structurées, les objets multimédia, l'aide à la décision et l'extraction de connaissances, tout en restant un système
relationnel (domaine actif de recherche Intelligence Artificielle).
Il n’existe pas encore de norme, et ces SGBD sont encore utilisés pour des usages bien spécifiques : le manque
de support et d’uniformité dans les implantations des différents SGBD du marché conduisent à les utiliser avec
prudence.
Schéma Schéma
externe A externe B
Niveau
logique
Niveau
physique
Schéma interne
SE
BD
Ce type d'architecture (norme ANSI/SPARC) comporte 3 schémas (conceptuel, externe, interne), 2 langages
(LDD et LMD) et gère 3 types d'utilisateurs (administrateur, programmeur, utilisateur final).
1) Schémas
Le schéma conceptuel est le niveau central, il décrit les données et les contraintes d'intégrité qui y sont liées. Il
n'y a qu'un schéma conceptuel.
Les schémas externes sont les visions des données d'un utilisateur ou d'un groupe d'utilisateurs. Ils décrivent
une partie seulement des données (vision parcellaire, incomplète), ce qui permet d'assurer sécurité et
confidentialité des données. Il existe autant de visions externes que d'utilisateurs, mais les visions des différents
utilisateurs vont se recouper (informations communes).
Le schéma interne décrit la manière dont les données sont stockées sur les organes physiques. Dans un SGBD,
l'organisation physique des données est effectuée par le système d'exploitation, ignoré par l'utilisateur. Il peut y
avoir plusieurs modèles physiques pour un même modèle logique.
Il y a indépendance logique si le schéma conceptuel peut être modifié ou enrichi sans que cela affecte les
schémas externes des utilisateurs et leurs programmes d'application, et indépendance physique si on peut
modifier le schéma interne sans affecter le schéma conceptuel. Cela permet de ne pas être lié au matériel ou au
système d’exploitation (seul le niveau interne en dépend).
2) Utilisateurs
L'administrateur est le(s) responsable(s) de tout ce qui touche à la BD : il s'occupe de la création de la base et
des utilisateurs, il définit les droits d'accès, assure le bon fonctionnement en gérant les sauvegardes…
Le programmeur développe des applications utilisant la BD. Il a le droit de créer de nouvelles tables et les
structures associées (vues, index, clusters…). Il définit les droits qui seront accordés aux utilisateurs des
applications qu’il développe.
L'utilisateur final n’a accès qu’aux données qui lui sont utiles. Il a certains droits accordés par l’administrateur :
consultation, ajout, modification, suppression. Généralement il n’a pas le droit de création, de modification ou de
suppression de tables.
1) Fichiers de la base
Tous les SGBD gèrent eux-mêmes l'enregistrement des données sur les mémoires auxiliaires (disques le plus
souvent). Les performances sont ainsi meilleures que s'ils utilisaient simplement le système d'exploitation et son
système de fichiers. En général, ils se réservent de très gros fichiers du système d'exploitation et ils gèrent eux-
mêmes cet espace pour allouer de la place aux tables, index et autres objets manipulés.
Un autre avantage est la plus grande facilité pour le portage sur des systèmes d'exploitation différents.
4) Fichiers log
Parallèlement à l'enregistrement des données, les processus serveurs enregistrent toutes les actions effectuées sur
les tables de la base (et dans les segments de rollback), dans des fichiers indépendants des fichiers de la base,
appelés fichiers log (redo log dans Oracle).
Comme pour les données de la base, les données enregistrées dans les fichiers redo log sont d'abord déposées en
mémoire dans des buffers et enregistrés dans les fichiers par un seul processus (Log Writer dans Oracle). Ces
enregistrements ont lieu régulièrement, par exemple quand les buffers sont pleins, et au moins dès qu'il y a eu un
COMMIT.
L'enregistrement d'un COMMIT dans les fichiers redo log est l'événement de référence pour la confirmation
d'une transaction. Chaque COMMIT déclenche une écriture immédiate sur le disque des entrées du buffer des
fichiers redo log correspondant à la transaction validée. Cette écriture est rapide car séquentielle alors que
l'écriture des modifications dans la base est même plus lente.
Lorsque les fichiers redo log ont enregistré un COMMIT et qu'une panne survient avant que les données
correspondant à la transaction de la base ne soient écrites dans la base, le SGBD effectue l'enregistrement
physique des données après la reprise. Si par contre c'est un ROLLBACK qui a été enregistré et si des
modifications ont déjà été enregistrées (par exemple parce que les buffers des fichiers redo log étaient pleins),
les données sont remises à leur état précédant la transaction après le redémarrage, à l'aide des segments de
rollback.
5) Segments de rollback
Quand des données sont modifiées dans une base Oracle, toutes les informations qui permettraient de retrouver
les anciennes données (essentiellement les valeurs anciennes des données modifiées) sont enregistrées dans la
base dans ce des segments de rollback.
Ces segments sont utilisés :
- pour annuler une transaction après une instruction ROLLBACK
- tant qu'une transaction n'est pas confirmée par un COMMIT, les modifications qu'elle apporte aux
données ne doivent pas apparaître aux autres transactions (principe de lecture consistante).
Une BD relationnelle est un ensemble de relations de l'utilisateur (relations de table) et de relations de catalogue
(relations système). Le nom d'une relation doit être unique dans l'ensemble des relations de la base, son nombre
de colonnes est fixe, son nombre de lignes quelconque.
Les colonnes sont appelées champ ou attribut. Chaque attribut a un nom unique dans une relation donnée, mais
on peut trouver deux attributs de même nom dans deux relations différentes. L'attribut prend sa valeur dans un
domaine (ensemble des valeurs acceptées). L'ordre des attributs n'a pas d'importance. Le nombre d'attributs
définit le degré de la relation.
Les lignes sont appelées n-uplets (tuples). Les lignes sont supposées toutes différentes, il n'y a pas de doublon
dans une table. L'ordre des lignes n'a pas d'importance, le nombre de n-uplets définit la cardinalité.
Il existe un certain nombre de tables automatiquement gérées par le système (créées par celui-ci), mis à jour par
le SGBD : il s'agit du catalogue. Un utilisateur peut consulter les catalogues (même langage que pour les tables),
mais n'a pas le droit d'écriture.
B. Langages d’interrogation
Principalement trois théories ont donné lieu à différents langages : l’algèbre relationnelle, qui est à la base du
langage SQL, calcul relationnel des tuples, qui a donné lieu au langage QUEL (SGBD "Ingres"), et calcul
relationnel des domaines, à la base du langage QBE (Query By Example) d’IBM
On a pu démontrer qu’ils étaient équivalents dans le sens où ils permettent de désigner les mêmes ensembles de
données.
3) Calcul relationnel
Le calcul relationnel des tuples et le calcul relationnel des domaines reposent sur le calcul des prédicats du
premier ordre. Cette théorie mathématique étudie les formules logiques construites avec un ensemble de
prédicats (c’est-à-dire de propositions qui peuvent être vraies ou fausses dans un certain contexte), les opérateurs
et, ou, négation, implication logique, des variables et les opérateurs ∀ et ∃.
A chaque formule logique correspond l’ensemble des données qui vérifient cette formule. L’interrogation de la
base de données consiste donc à énoncer une formule qui correspond aux données que l’on souhaite extraire de
la base.
Exemple :
Nom des fournisseurs (qui fournissent effectivement des pièces) :
tuples : {F.Nom / fournisseur(F) et (∃ R fournit(R) et F.F#= R.F#)}
domaines : {n / ∃ m fournisseur(F# : m, Nom : n) et fournit(F# : m)}
1) SQL*Plus
SQL*Plus est interpréteur en ligne de commandes fourni par le SGBD Oracle.
Exécution d’un fichier contenant des requêtes (fichier.sql) : SQL> @fichier
Fin de la saisie dans exécution : insertion d'une ligne blanche
SQL> …
2…
3 <CR>
SQL>
Fin de la saisie avec exécution immédiate :
- point-virgule à la fin de la dernière clause,
- slash : 1er caractère de la dernière ligne du buffer.
Exécution de l'instruction du buffer :
SQL> / ou SQL> RUN
2) Le langage SQL
Le langage SQL, pour Structured Query Language, permet de définir et manipuler des données conformément à
la norme ANSI.
a) Types de données
Chaînes de caractères de longueur fixe (sensible à la casse)
CHAR(size) [BYTE | CHAR] | NCHAR(size) : size facultatif, exprimé en octets ou nombre
de caractères. Max. : 2000 octets pour CHAR, dépendant du jeu de caractère national pour NCHAR,
plafonné à 2000. Min. et Défaut : 1 octet pour CHAR, 1 caractère pour NCHAR.
Chaîne de caractères de longueur variable (sensible à la casse)
VARCHAR2(size) [BYTE | CHAR] | NVARCHAR2(size) : size obligatoire, exprimé en octet
ou nombre de caractères. Max. : 4000 octets pour VARCHAR2, dépendant du jeu de caractère national
pour NVARCHAR2, plafonné à 4000.
LONG : Sans préciser de taille : chaînes de caractères de longueur variable, jusqu'à 2 Go.
b) Instruction SQL
- insensible à la casse
- instruction sur une ou plusieurs lignes
- ne pas abréger ou couper les mots clés
a) Requête
SELECT ... (attributs sur lesquels on projette)
FROM ... (relation, ou produit cartésien)
[WHERE ...] (sélection, optionnel)
Projection
SELECT [DISTINCT] { expression [c_alias] | * …]
Expression valide
- [[schema.]table.]attribut exemple : scott.emp.empno
- 'texte' 'travaille à'
- nombre 15
- fonction[(arguments)] UPPER(nom)
- combinaison de ces expressions
Alias pour expression / attribut
- renomme l'entête d'une colonne (affichage ou clause ORDER BY)
- utile si expression calculée
- suit immédiatement l'expression (mot-clé AS facultatif entre attribut et alias)
- à écrire entre guillemets (") si les majuscules et minuscules doivent être différenciées, ou si la chaîne
comporte des espaces ou caractères spéciaux
Produit cartésien
FROM table [t_alias] [, table [t_alias]] …
t_alias : renommage de la table le temps de la requête (Æ raccourci d'écriture)
Restriction
WHERE condition
(clause facultative, si omise, tous les n-uplets sont sélectionnés)
b) Opérateurs
Opérateurs ensemblistes
UNION, INTERSECT, MINUS
4) Fonctions
On distingue deux types de fonctions : les fonctions single row, et les fonctions multiple row.
Nous verrons ici les fonctions single row (les fonctions multiple row seront vues au paragraphe suivant).
Caractéristiques des fonctions single row :
- appliquée sur chaque ligne renvoyée par la requête
- renvoie un résultat par ligne
- le type de résultat peut être différent de celui sur lequel elle s'applique
- autorisée dans les clauses SELECT, WHERE et ORDER BY
- peut être imbriquée
a) Fonctions numériques
- ABS, MOD, ROUND, TRUNC, SIGN
- CEIL, FLOOR
- COS, SIN, TAN
- COSH, SINH, TANH
- EXP, LN, LOG
- POWER, SQRT
Exemples
SELECT MOD(1600, 300) FROM dual; Æ 100
SELECT ROUND(45.926, 2) FROM dual; Æ 45.93
SELECT ROUND(45.923, -1) FROM dual; Æ 50
SELECT TRUNC(45.926, 2) FROM dual; Æ 45.92
d) Conversions
TO_NUMBER TO_DATE
TO_CHAR TO_CHAR
TO_CHAR(1234,'099999') → 001234
TO_CHAR(1234,'$999999') → $1234
TO_CHAR(1234,'999999.99') → 1234.00
TO_CHAR(1234,'999,999') → 1,234
5) Compléments au SELECT
SELECT attribut, group_function(attribut)
FROM table
[ WHERE condition ]
[ GROUP BY group_by_expression ]
[ HAVING group_condition ]
[ ORDER BY attribut]
a) Ordonnancement
ORDER BY {attribut | expression | c_alias} [ASC | DESC]
Spécifie l'ordre d'affichage du résultat.
Cette instruction vient forcément en fin de requête.
Exemple
SELECT * FROM Emp ORDER BY nom, job;
b) Fonctions d'agrégation
Nous utiliserons ici les fonctions multiple row, encore appelées fonctions de groupe ou fonctions d'agrégation
(multiple row functions ou group functions sont des appellations Oracle).
Ces fonctions sont :
- autorisée dans les clauses SELECT, HAVING
- non autorisée dans la clause WHERE
Fonctions sur des données numériques :
- AVG : moyenne
- STDDEV : déviation standard
- SUM : somme
- VARIANCE : variance
Fonctions avec des données quelconques :
- COUNT : cardinal
- MAX : maximum
- MIN : minimum
c) GROUP BY
Dans les exemples précédents il y avait un seul groupe :
- la relation toute entière
- une sous relation (clause WHERE)
Æ Réponse avec un seul n-uplet.
Il est possible de manipuler plusieurs groupes dans une même requête : clause GROUP BY
Æ Réponse avec autant de n-uplets qu'il y a de groupes.
Exemple Emp id nom job mgr dpt
18 Smith Directeur --- 30
26 Adams Vendeur 18 30
27 Scott Monteur 35 20
32 Miller Caissier 35 10
35 Ryan Directeur --- 10
SELECT COUNT(*) card card SELECT dpt, COUNT(*) card card dpt
FROM Emp FROM Emp
GROUP BY dpt; 2 GROUP BY dpt; 2 30
1 1 20
2 2 10
Règles du GROUP BY
Les expressions de la clause GROUP BY ne sont pas impérativement dans la clause SELECT (cf. exemple
précédent)
La clause GROUP BY peut comporter plusieurs expressions séparées par des virgules :
Exemple : ... GROUP BY mgr, dpt
Ordre d'exécution
1. WHERE : sélection des n-uplets
2. GROUP BY: calcul des groupes
3. HAVING : calcul des fonctions d'agrégation, élimination des groupes qui ne remplissent pas la
condition
4. ORDER BY : tri
Æ Affichage
Exemples
Appels imbriqués de fonctions
SELECT MAX(AVG(sal))
FROM Emp
GROUP BY deptno;
A. Eléments du modèle
1) Entité
Une entité est un objet concret ou abstrait qui peut être distinctement identifié dans l'esprit du concepteur et qui
présente un intérêt particulier. En général, une entité représente le nom dans une phrase.
Représentation graphique :
<nom-classe>
2) Association
Une association est une relation entre une ou plusieurs entités. L'association représente généralement le verbe
d'une phrase.
Représentation graphique : il en existe de nombreuses, il faut en choisir une.
Un type d'association ne peut pas être directement relié avec un autre type d'association.
Un type d'entité de peut être relié à un autre type d'entité que par un lien d'association.
Il n'y a pas de restriction sur le nombre de types d'associations entre types d'entités.
Une occurrence d'association associe plusieurs entités : une et une seule entité par classe d'entités intervenant
dans le type d'association.
3) Cardinalités et fonctionnalités
Cardinalité min et max reportées sur le graphique :
a,b c,d
Personne Possède Voiture
4) Attribut
Un attribut est la propriété d'un type d'entité ou d'association. Une propriété a une valeur.
Exemple :
Personne Personne
id - id
nom Autre notation :
- nom
âge - âge
adresse - adresse
Les attributs prennent obligatoirement des valeurs simples, (pas de structure, pas d'ensemble). Les valeurs
peuvent être définies facultatives ou obligatoires.
Les attributs peuvent être : des identifiants (clés, soulignés dans la représentation graphique), ou des descripteurs
(tous les autres).
Les attributs du type d'association regroupent les clés de chacun des types d'entités de l'association + des attributs
propres à l'association :
Fournisseur Produit
0,n 0,n
Id-fourn Ligne catalogue Id-produit
Nom Désignation
Prix
Clé de l'association : a priori, elle est constituée de toutes les clés de l'ensemble des clés des entités qui
interviennent dans l'association :
Etudiant Enseignement
0,n 0,n
net Note Matière
Nom Enseignant
Adresse
1,1
Agé de
0,n Tarif
1,1 0,n
Année Détermine Id-tarif
Age
Ou encore :
Etudiant Enseignement
0,n 0,n
net Note Matière
Nom Enseignant
Adresse
1,1
Prix
0,n
Paie Age
Tarif
B. Concepts complémentaires
1) Agrégation
Problème
Comment exprimer que le couple possède un logement ? Il faudrait relier deux classes d'associations entre elles
("Marié à" et "Possède"), ce qui est interdit dans le modèle entités – associations.
D'où l'agrégation :
2) Généralisation / spécialisation
♦ Généralisation : regrouper les différents types d'entité en faisant abstraction de leurs différences.
Æ type générique (mise en facteur des attributs communs).
♦ Spécialisation : pour un type donné, on définit des sous-types en mettant en évidence leurs particularités.
Exemple :
Personne
Personne
id
id nom
nom
sexe
Homme Femme
service militaire nom jeune fille Homme Femme
service militaire nom jeune fille
Il y a héritage des attributs du type générique :
Exemple : Homme < id, nom, service militaire > (id et nom proviennent de Personne).
♦ Dans ce modèle, il n'y a plus de raison d'admettre des attributs à valeur nulle.
♦ Il peut y avoir N niveaux d'abstraction : Véhicule
Terrestre Aérien
Diesel Essence
Sur N critères :
Personne
Berline Monospace
Totalité : T
Exclusion : ×
Personne
Homme Femme
Chanteur Musicien
Personne Chanteur Musicien voix instrument
Personne ×
0, n 0, n
Salarié Entreprise
Une personne ne peut pas être à la fois étudiant dans une (ou plusieurs) université(s) et salarié dans une (ou
plusieurs) entreprises.
Certaines personnes ne sont ni l'un ni l'autre.
0, n Etudiant 0, n
Personne × Cours
0, n
Enseignant 0, n
Une personne ne peut pas être à la fois étudiant et enseignant dans le même cours.
0, n Membre 1, n
Personne | Association
0, n
Président 1, 1
Le président d'une association est choisi parmi les membres de cette association.
Exemple (contrainte d'unicité)
Personne Date
0, n 0, n
1 Occupe
0, n
Fonction
Une personne à une date donnée ne peut occuper qu'une et une seule fonction.
Cours
Chanteur Musicien
Donne id-cours
voix instrument 0, n 1, 1
intitulé
1) Définition
Soit R une relation dont les attributs sont U = {u1, u2, ..., un} et X ⊂ U, Y ⊂ U. On dit que dans la relation, Y
dépend fonctionnellement de X, ou X détermine Y, si :
∀ u ∈ R, ∀ v ∈ R, projX (R | u) = projX (R | v) ⇒ projY (R | u) = projY (R | v).
Plus simplement, un attribut Y dépend fonctionnellement d'un attribut X si, étant donnée une valeur de X, il lui
correspond une valeur unique de Y (quel que soit le n-uplet considéré).
Notation : X → Y
2) Règles d'inférence
Notation : ├. Il est généralement possible de déduire de nouvelles DF à partir des DF existantes. Les trois
premières règles sont les axiomes d'Armstrong (1974), les trois suivantes en sont déduites.
Notons X, Y, Z et W des sous-ensembles d'attributs de la relation R.
Réflexivité. Tout ensemble d'attributs détermine lui-même ou une partie de lui-même.
Y⊆X├X→Y
Augmentation. Si X détermine Y, les deux ensembles d'attributs peuvent être enrichis par un troisième.
X →Y ├ X, Z → Y, Z
Z ⊆ W et X → Y ├ X, W → Y, Z
Transitivité. Le composé de deux fonctions dont l'image de l'une est le domaine de l'autre, est une fonction.
X → Y et Y → Z ├ X → Z
Union.
X → Y et X → Z ├ X → Y, Z
Pseudo-transitivité.
X → Y et Y, W → Z ├ X, W → Z
Décomposition.
X → Y et Z ⊆ Y ├ X → Z (parce que Z ⊆ Y ├ Y → Z)
3) Manipulation des DF
a) Fermeture
Soit F un ensemble de DF. Il est possible de composer par les règles d'inférence les DF de F. La fermeture
transitive de F, notée F+, est l'ensemble de toutes les DF résultant de l'application des règles d'inférence sur les
DF de F.
L'application d'une règle d'inférence construit F1 à partir de F, puis F2, ..., puis Fn. On s'arrête lorsque Fn+1 = Fn, et
donc F+ = Fn (= Fn+1).
b) Couverture
Il est intéressant de déterminer un sous-ensemble minimal de DF permettant de générer toutes les autres : c'est la
couverture minimale d'un ensemble de DF. Le calcul de la couverture permet de faire baisser le nombre de
vérifications qui sont à faire.
La couverture minimale de F est l'ensemble F0 tel que : F0+ = F+.
Notation : ^F
c) DF élémentaires
Une DF X → Y est pleine ou élémentaire s'il n'existe pas de sous-ensemble strict X' de X (X' ⊂ X et X' ≠ X) tel
que X' → X.
On dira que Y est pleinement dépendant de X.
d) Clé de relation
Il est possible de donner une définition formelle de la notion de clé à partir des DF : une clé est un ensemble
minimal d'attributs qui détermine tous les autres.
Autrement dit, X est un clé (ou un identifiant) de la relation R si X → U est une DF élémentaire.
Un ensemble d'attributs qui inclut une clé est appelé superclé.
Il peut y avoir plusieurs clés pour une relation, mais on en choisit une comme clé primaire.
Notation : <Numéro, Nom> (la clé est Numéro).
Lorsque deux attributs forment la DF élémentaire : <Num1, Num2, Nom> (la clé est le couple). La notation
<Num1, Num2, Nom> est identique.
B. Normalisation de relation
On part de deux ensembles : une relation universelle (relation unique qui contient tous les attributs de
l'application), et l'ensemble F des DF sous forme minimale.
On décompose la relation universelle en utilisant F pour obtenir un ensemble de relations pour une certaine
forme normale (FN) choisie à l'avance : 1ère, 2ème, 3ème, 3.5ème (forme normale de Boyce Codd), 4ème et 5ème.
Les trois premières FN ont été définies par Codd (1972).
• 1FN : la plus simple, évite les domaines composés de plusieurs valeurs.
• 2FN : beaucoup de redondances Æ coût élevé de MAJ.
• 3FN : peu de redondances Æ coût faible de MAJ, mais beaucoup de jointures.
Sur l'exemple employés < matricule, nom, dpt, nom-dpt > avec la DF dpt → nom-dpt, il y a des anomalies lors
de modifications des données :
• Anomalies d'insertion : on ne peut pas ajouter de nouveaux départements (numéro et nom) si le
département ne comporte pas d'employé.
• Anomalies de modification : si on change le nom d'un département, on doit le changer dans toutes les
lignes des employés de ce département.
• Anomalies de suppression : si on supprime le dernier employé d'un département, on perd l'information
(numéro et nom) du département.
D'où la nécessité de découper les tables en formes normales.
R: X Y Z W
La clé est le couple X, Y. Donc X, Y → Z, W. Or Y détermine à lui seul W : Y → W. Donc W dépend d'une
partie de la clé. Il faut donc décomposer R en : R1 <X, Y, Z> et R2 <Y, W>.
R: X Y Z W
La clé de la relation est X. Donc X → Y, Z, W. Or Y détermine à lui seul W : Y → W. Donc W dépend d'un
attribut non clé. Il faut donc décomposer R en : R1 <X, Y, Z> et R2 <Y, W>.
4) Arrêt de la décomposition
On arrête la décomposition lorsque la FN souhaitée est obtenue.
R: X Y Z W
La clé est le couple X, Y. Donc X → Z, W. Or W détermine X : W → X. Donc une partie de la clé dépend d'un
attribut non clé. Il faut donc décomposer R en : R1 <X, Y, Z> et R2 <W, X>.
En 4FN parce qu'il n'existe pas de DM (par exemple buveur →→ cru est faux parce qu'il n'existe pas le tuple
(Meyer, Gewurtz, Claude)).
Il reste encore des redondances : on apprend deux fois que Meyer boit de l'Edel et que André produit de l'Edel.
Mais il est impossible de décomposer de deux relations.
Les DM permettent de décomposer une relation en deux, les DJ permettent de décomposer une relation en N
relations.
On obtient alors le schéma :
buveur cru buveur producteur cru producteur
Meyer Edel Meyer Claude Edel Claude
Meyer Gewurtz Meyer André Edel André
Brandel Edel Brandel André Gewurtz André
En 5FN.
Une décomposition en plusieurs relations est dite sans perte de données si la jointure des relations obtenues
dans la décomposition redonne la relation de départ (c'est à dire sans données manquantes ou superflues). Il faut
évidemment ne jamais faire de décomposition avec pertes de données car les informations contenues dans la
base sont alors fausses et il est impossible de rétablir les bonnes données.
Soit une relation R(A,B,C), où A, B, C sont des ensembles d'attributs disjoints, avec la DF B → C. On peut
démontrer que la décomposition de R en R1(A,B) et R2(B,C) est sans perte de données.
Exemple.
DF = { matr → nom-dpt,
dpt → nom-dpt }
Cette relation peut être décomposée en :
mais c'est une décomposition avec perte de données (qui est ici un surplus de données parasites) car la jointure
de ces deux relations donne plus de n-uplets que la relation de départ si plusieurs employés ont le même salaire.
Ceci est dû au fait que l'attribut commun (salaire) n'est pas source d'une DF vers les autres attributs des deux
relations de la décomposition.
Une décomposition sans perte de données est par exemple :
dans laquelle l'attribut commun (dpt) est la source de la DF dpt → nom-dpt, et donc on n'a pas de perte de
données.
Soit une relation R décomposée en deux relations R1 et R2. La projection de l'ensemble des dépendances de R
sur la relation R1 s'obtient en ne gardant des dépendances de départ de R que celles dont les attributs (de la
source et du but) sont des attributs de la relation R1.
Une décomposition en plusieurs relations est dite sans perte de dépendances si on peut retrouver logiquement
(par exemple par transitivité) les dépendances de départ à partir de la projection de l'ensemble des dépendances
de départ sur les relations de la décomposition.
Si on décompose une relation en plusieurs relations avec perte de dépendances, one ne peut travailler
indépendamment dans chacune des relations de la décomposition sans s'occuper des autres relations. Lors des
mises à jour, on ne peut en effet s'assurer que les dépendances perdues sont vérifiées qu'en consultant les autres
relations, ce qui peut s'avérer coûteux.
Lorsqu'on a le choix entre plusieurs décompositions, il faut évidemment choisir celles qui préservent les
dépendances. Mais une perte de données est plus grave qu'une perte de dépendance et il peut arriver qu'il faut
choisir entre une perte de dépendance et une perte de normalisation. En effet, on peut démontrer qu'il est toujours
possible de normaliser un schéma en 3FN sans perte de données et de dépendances. Mais il n'est pas toujours
possible de conserver les dépendances si on veut normaliser un schéma avec uniquement des relations en FNBC,
4FN ou 5FN.
On veut ajouter la règle "deus personnes d'un même département ne peuvent participer à un même projet". Cette
règle de gestion implique la DF dpt, code-pr →matr. Pour tenir compte de la nouvelle règle, le schéma devient :
EMP <matr, nom-emp, poste, date-emb, salaire, commission, dpt>
DPT <dpt, nom-dpt, lieu>
PROJET <code-pr, nom-pr>
PARTICIPE2 <dpt, code-pr, matr, fonction>
On ne peut enlever l'attribut dpt de la relation EMP malgré son ajout dans PARTICIPE2, car on perdrait le
département des employés qui ne participent à aucun projet.
La relation PARTICIPE2 est en 3FN mais elle n'est pas en FNBC à cause de la DF matr → dpt. Pour obtenir un
schéma en FNBC, une solution est de décomposer PARTICIPE2 en R1 < code-pr, matr, fonction >, et
R2 < matr, dpt >. R2 est redondante avec EMP, et R1 n'est autre que PARTICIPE. On se retrouve ainsi avec le
schéma initial. Cette décomposition est sans perte de données comme on peut le vérifier aisément (il est évident
que l'on retrouve exactement la relation PARTICIPE2 à partir de R1 et R2 grâce à la DF matr → dpt), mais pas
sans perte de dépendance : la projection des dépendances ne contient que les DF matr → dpt et
code-pr, matr → fonction, on ne peut en déduire la dépendance dpt, code-pr → matr.
Cette perte de dépendance est due au fait que l'on ne peut pas vérifier la nouvelle règle de gestion en travaillant
seulement sur une des relations. On est obligé de refaire une jointure (même partielle) des deux trables
PARTICIPE2 et EMP pour vérifier la contrainte, par exemple, si on veut changer un employé de projet, ou
ajouter un nouvel employé.
Il faut donc faire un choix entre la perte de dépendance si l'on éclate la relation en deux relations en FNBC et les
problèmes éventuels dus au fait que la relation PARTICIPE2 n'est pas en FNBC. Par exemple, si on travaille
avec PARTICIPE2, et si un employé qui participe à plusieurs projets change de département, il faudra changer le
département dans toutes les lignes de PARTICIPE2 qui concernent cet employé.
La relation PARTICIPE2 est un exemple de relation "atomique" qui ne peut être décomposée sans perte de
dépendance.
a) Création de tables
Syntaxe
CREATE TABLE nom-table (colonne [, colonne…] [, contrainte-de-relation] [, contrainte-de-relation…])
colonne = nom-col type-de-données [défaut] [contrainte-de-colonne]
Exemple
CREATE TABLE Prix ( age NUMBER (2) PRIMARY KEY,
tarif CHAR (2) DEFAULT 'T1',
CHECK (age > 25) ) ;
CREATE TABLE Etudiant ( net NUMBER (2),
facultatif
nom VAR CHAR 2 (30),
age NUMBER (2) REFERENCES prix.age,
adresse VAR CHAR 2 (60),
PRIMARY KEY (net), ou
FOREIGN KEY (age) REFERENCES prix.age) ;
b) Modification de tables
Modifications autorisées :
- ajouter un attribut : on ne peut pas spécifier l'endroit où doit apparaître la colonne, elle sera
impérativement en dernière position ; si la relation est non vide lors de l'ajout d'un nouvel attribut, la
valeur de la nouvelle colonne est initialement NULL pour toutes les lignes existantes, même si on
définit une valeur par défaut
c) Suppression de tables
Syntaxe
DROP TABLE nom-table [CASCADE CONSTRAINTS]
Supprime la table du dictionnaire ainsi que toutes ses lignes, index, blocs physiques, vues…
CASCADE CONSTRAINTS : pour demander la suppression de toutes les CI dans les autres tables de la base
qui font référence à la clé primaire et aux clés uniques de la table supprimée ; si on ne précise pas CASCADE et
s'il y a des références, alors message d'erreur
d) Renommage de tables
Syntaxe
RENAME ancien_nom TO nouveau_nom
Tous les liens (CI-réf) sont mis à jour.
2) Manipulation de données
Travail sur le contenu des tables :
- INSERT : insertion de lignes
- DELETE, TRUNCATE : suppression de lignes
- UPDATE : modification de lignes
b) Suppression de données
Syntaxe
DELETE FROM nom-table [ WHERE condition ]
Suppression des lignes qui satisfont la condition. Pas de condition Æ suppression de toutes les lignes.
Exemple
DELETE FROM Etudiant WHERE nom LIKE 'Meyer' OR age > 36
DELETE FROM Prix
Syntaxe
TRUNCATE TABLE table
Suppression de tous les n-uplets et libération espace mémoire allouée à la table.
Opération irréversible (de type LDD) qui nécessite un privilège particulier.
c) Mises à jour
Syntaxe
UPDATE nom-table
SET { nom-col = { expression | (subquery) } | (nom-col [, nom-col…]) = (subquery) }
[ WHERE condition ]
Mise à jour des attributs cités des lignes qui vérifient la condition, ou de toutes les lignes si la condition est
ommise.
Exemple
UPDATE Prix SET tarif = 'T12' WHERE age = 30
UPDATE Etudiant SET age = age + 1 WHERE nom = 'Meyer'
UPDATE Etudiant SET (age, adresse) = (SELECT age, adresse FROM…)
Interdit : SET (age, adresse) = (25, 'Strasbourg')
A. Concepts
Vues :
- fenêtre dynamique sur la base,
- ses données proviennent d'autres tables ou d'autres vues.
Exemple table emp
id nom job dpt
vue empv1
numéro nom emploi
1) Syntaxe
CREATE [OR REPLACE] [ FORCE | NOFORCE ] VIEW view [ ( alias [,alias]…)]
AS subquery
[ WITH CHECK OPTION [CONSTRAINT constraint ] ]
[ WITH READ ONLY ]
subquery :
- SELECT complexe autorisé : join, GROUP BY, select imbriqué ;
- pas de ORDER BY (sera demandé dans la sélection si besoin)
Mots-clés :
- OR REPLACE : change la définition de la vue si elle existe déjà. Evite de supprimer, re-créer, redéfinir
les privilèges accordés au préalable.
- FORCE : création de la vue sans tenir compte tenir si les relations de base existent ou non.
- NOFORCE (valeur par défaut) : création de la vue uniquement si les relations de base existent.
- alias : spécifie les noms pour les expression sélectionnées dans la sous-requête. Le nombre d'alias doit
correspondre en nombre avec ces expressions.
- subquery: instruction SELECT qui peut contenir des c-alias.
- WITH CHECK OPTION : spécifie que seules les lignes accessible par la vue peuvent être insérées ou
modifiées.
- constraint : nom assigné à la contrainte WITH CHECK OPTION.
- WITH READ ONLY : garantit qu'aucune opération du LMD (insert, update, delete) ne peut être
exécutée sur cette vue
3) Sélection
Une vue peut être interrogée comme une relation ordinaire.
Exemple
SELECT * FROM empv1 WHERE emploi='manager'
Mise en œuvre de la sélection par le serveur Oracle
- recherche de la définition de la vue : catalogue USER_VIEWS,
- vérification des droits d'accès sur la (les) table(s) de base,
- conversion de la requête sur la vue en une requête sur table(s) de base.
4) Vues complexes
Nombre de tables vue simple 1 vue complexe 1 ou plusieurs
Contient fonction non oui
Contient des groupes non oui
LMD sur la vue oui pas toujours
Suppression
Suppression d'un n-uplet interdite si la définition de la vue comporte :
- fonction d'agrégation,
- clause GROUP BY,
- mot clé DISTINCT.
Modification
Modification d'un n-uplet interdite si la définition de la vue comporte :
- fonction d'agrégation,
- clause GROUP BY, idem suppression
- mot clé DISTINCT,
- colonnes définies à l'aide d'expressions.
Conséquences
- suppression de la définition dans le dictionnaire,
- invalidation des vues et applications qui y sont liées,
- aucune suppression de données dans les tables.
6) Conclusion
Vue dérivée de données de tables, vues sous-jacentes.
Avantages fournis :
- restriction des accès à la base,
- simplification des requêtes,
- perception des données propre à chaque utilisateur,
- peut être supprimée sans qu'il y ait suppression des données sous-jacentes.
2) Types de clusters
Deux types de clusters : index clusters et hash clusters.
a) Cluster indexé
Utilise un index (l’index de cluster) pour gérer les données dans le cluster.
- L’index doit être disponible pour stocker, accéder et gérer les données dans le cluster.
- L’index est utilisé pour retrouver le bloc contenant les lignes correspondant à une clé donnée.
- La structure d’un tel index est similaire à la structure d’un index normal :
o Par contre cet index peut stocker des valeurs NULL (un index normal non).
o Une seule entrée (bloc de lignes) pour chaque clé d’un index de cluster.
o Normalement plus petit qu’un index normal pour le même ensemble de valeurs.
- Pour stocker ou retrouver des lignes dans un cluster, le serveur Oracle utilise l’index pour retrouver le
bloc et donc la première ligne correspondant à la clé donnée, et donc pour retrouver les lignes
correspondant à la clé donnée.
b) Cluster haché
Utilise une fonction pour calculer l’emplacement d’une ligne. La fonction de hachage utilise la clé de cluster et
peut être soit définie par l’utilisateur, soit générée par le système.
Quand une ligne est insérée dans une table d’un cluster haché :
- les colonnes de la clé de hachage sont utilisées pour calculer la valeur de hachage
- la ligne est stockée selon la valeur de hachage
La fonction de hachage est utilisée pour localiser la ligne correspondant à la donnée de la table de hachage.
Quand applicable, un hash cluster procure de meilleures performances qu’un cluster indexé.
3) Création de clusters
1) Structure de stockage
Une table organisée-index conserve toutes les données d’une table dans un B-arbre.
L’index B-arbre, basé sur la clé primaire de la table, est organisé comme un index.
Dans cette structure, le block-feuille contient les colonnes non-clés, à la place du ROWID, comme le second
élément de l’entrée de la feuille de l’index.
Ainsi, l’utilisation d’une table organisée-index élimine le fait d’avoir deux segments séparés, un pour la table et
un pour l’index.
4) Création
Une organisation sous forme d’index est intéressante pour une table souvent accédée par sa clé primaire et qui
n’a que peu de colonnes non clés.
6) Information
DBA_TABLES, DBA_INDEXES
I. Sécurité
A. Sécurité de fonctionnement
Suite à un incident matériel ou logiciel, il convient de redémarrer le système et de remettre la BD en état
cohérent, en utilisant l'archivage (copie de sauvegarde sur un autre support : CD, DAT, disquette...) et la
journalisation (un journal mémorise toutes les transactions effectuées sur la BD ; en cas de panne de courant, le
système lit le journal).
Durant une transaction (ensemble de modifications de la base qui forme un tout indivisible), des opérations sont
effectuées sur la BD, qui est donc non cohérente temporairement, ce qui est risqué, si un autre utilisateur y
accède à ce moment.
La transaction doit être terminée ou non exécutée. Une transaction est terminée soit par une validation qui
entérine les modifications, soit par une annulation qui remet la base dans son état initial. Deux transactions ne
peuvent se chevaucher. L’utilisateur peut à tout moment valider la transaction en cours (COMMIT en SQL), les
modifications deviennent alors définitives et visibles à l’ensemble des utilisateurs.
Tant que la transaction n’est pas validée, les modifications qu’elle contient n’apparaissent qu’à l’utilisateur qui
l’exécute. Tous les autres utilisateurs voient la base dans l’état où elle était avant le début de la transaction.
L’utilisateur peut annuler la transaction en cours (ROLLBACK en SQL), les modifications effectuées depuis le
début de la transaction sont alors annulées.
Transaction 1 Transaction 2
Verrouiller la table A
Verrouiller la table B
Verrouiller la table B
(attente) Verrouiller la table A
(attente)
Ce type d’interblocage ne peut pas arriver si tous les utilisateurs bloquent les tables dans le même ordre.
Transaction 1 Transaction 2
V = 100
Lire V
ROLLBACK
Ce cas ne peut pas arriver si les modifications effectuées par une transaction ne sont visibles par les autres
qu’après validation (COMMIT) de la transaction.
Lecture non répétitive, ou non reproductible, ou incohérente. Une transaction lit deux fois une même valeur
et ne trouve pas la même valeur les deux fois.
Transaction 1 Transaction 2
Lire V
V = V + 100
COMMIT
Lire V
Pour éviter ce cas, T1 devra bloquer les données qu’il veut modifier suffisamment longtemps pour empêcher les
autres transactions de les modifier.
Lignes fantômes. Une sélection de lignes récupère des lignes qui sont modifiées par une autre transaction et ne
vérifient plus le critère de la sélection. La même sélection lancée une seconde fois ne retrouve donc plus ces
lignes.
Transaction 1 Transaction 2
a) Début transaction
Implicite :
- 1ère instruction SQL exécutable qui suit une connexion à la base
- fin de transaction précédente (COMMIT, ROLLBACK)
- après instruction du LDD (COMMIT implicite après chaque instruction du LDD)
Explicite : SET TRANSACTION
- SET TRANSACTION READ ONLY
- SET TRANSACTION READ WRITE
- SET TRANSACTION USE ROLLBACK SEGMENT segment
b) Point de sauvegarde
SAVEPOINT savepoint
Nom d'un point de sauvegarde de la transaction.
Nom unique pour la transaction courante, si le nom existait déjà, le 1er point de sauvegarde est écrasé.
e) Validation
Explicite : COMMIT
- finit la transaction courante
- tous les changements sont permanents et deviennent visibles aux autres utilisateurs
- supprime tous les points de sauvegarde
- libère les verrous
Implicite :
- avant et après chaque instruction du LDD
- lors de sortie normale de la session (exit)
f) Exemple
sqlplus scott/tiger
SQL > INSERT … transaction 1
SQL > CREATE TABLE … transaction 2
SQL > DELETE … transaction 3
SQL > COMMIT …
SQL > INSERT …
SQL > SAVEPOINT save1
SQL > OPDATE …
transaction 4
SQL > ROLLBACK TO save1
SQL > UPDATE …
SQL > EXIT
Validation automatique
Variable AUTOCOMMIT (SQL*Plus)
SET AUTOCOMMIT OFF : par défaut
SET AUTOCOMMIT ON :
- un COMMIT suit toutes les modifications
- ROLLBACK n'a plus d'effet
a) Syntaxe
LOCK TABLE [schema .] { table | view } [, [schema .] { table | view } …] IN lockmode MODE [NOWAIT];
Si on met un verrou sur une vue, Oracle bloque la (les) table(s) de base.
lockmode :
- ROW SHARE (= SHARE UPDATE) : accès concurrents autorisés, mais les autres utilisateurs ne
peuvent pas bloquer l'objet pour un accès exclusif.
- ROW EXCLUSIVE : comme ROW SHARE mais interdit les blocages concurrents en mode SHARE.
Ce mode est automatiquement obtenu lors d'opérations de LMD.
- SHARE : requêtes concurrentes autorisées, mais pas de MAJ.
- SHARE ROW EXCLUSIVE : autorise les requêtes d'autres utilisateurs mais empêche qu'ils bloquent
en mode SHARE ou MAJ (utilisé pour parser toute la table de manière consistante).
- EXCLUSIVE : autorise d'autres requêtes mais pas d'autre activité.
b) Exemple
LOCK TABLE emp IN EXCLUSIVE MODE NOWAIT
c) Remarques
Le privilège système LOCK ANY TABLE permet de bloquer toute table.
Pas de commande UNLOCK… (pour débloquer : COMMIT, ROLLBACK, EXIT)
II. Confidentialité
A. Contrôle de l’accès à la base
L’accès à la base est contrôlé par une gestion des droits d'accès des différents utilisateurs (mots de passe) et des
privilèges (les utilisateurs n’ont pas tous les mêmes droits).
1) Privilège
- droit d'exécuter certaines instructions SQL
- l'administrateur de la base a les privilèges les plus élevés
- instructions
o GRANT : transmission de privilèges
o REVOKE : suppression de privilèges
Types de privilèges :
- système : droit d'accès à la base
- objet : manip. du contenu des objets de la base
- schéma : collections objets : table, vue, séquence
Privilèges système : administrateur
L'administrateur de la base a les droits nécessaires pour :
- créer de nouveaux utilisateurs
- supprimer des utilisateurs
- supprimer des tables (quel que soit le schéma)
- créer des rôles
- effectuer le back up de n'importe quelle table
- …
3) Rôle
Un rôle est un groupe de privilèges
- auquel on a donné un nom et
- qui peut être attribué à un utilisateur
Permet de faciliter la gestion des privilèges : pour un grand nombre d'utilisateur, il est plus simple de leur
affecter un rôle plutôt que plusieurs privilèges.
Création du rôle : CREATE ROLE rôle ;
Assignation de privilèges au rôle : GRANT privilège [, privilège…] TO rôle ;
Affection de rôles aux utilisateurs : GRANT rôle TO user1 [, user2…] ;
III. Intégrité
A. Contraintes d'intégrité
Les opérations doivent respecter les contraintes d'intégrité implicitement. Les commandes qui ne respectent pas
ces contraintes sont automatiquement annulées (toute la commande est annulée si une seule des lignes ne
respecte pas une contrainte d’intégrité).
IV. Performances
A. Accès aux données
Les langages d’utilisation des SGBD relationnels ne font pas référence au cheminement à suivre pour accéder
aux données. Il y a donc un risque de performances dégradées (données non contiguës, isolées…).
Pour y remédier, il est possible de définir des index sur une rubrique qui permettent d'accélérer l’accès aux lignes
qui ont une certaine valeur ou accélérer le tri des lignes dans l’ordre de rangement de l’index, ou des clusters
(rangement physique de plusieurs tables dans un même espace) permettant d'accélérer les jointures sur ces tables
en partageant des colonnes entre plusieurs tables.
C. Expressions
expr::= { simple_expression
| compound_expression
| datetime_expression
| interval_expression
| object_access_expression
}
simple_expression::= { [ query_name .
| [schema .] { table . | view . | materialized view . }
] { column | ROWID }
| ROWNUM
| text
| number
| sequence . { CURRVAL | NEXTVAL }
| NULL
}
compound_expression::= { ( expr )
| { + | - | PRIOR } expr
| expr { * | / | + | - | || } expr
}
datetime_expression::= datetime_value_expr AT
{ LOCAL
| TIME ZONE { ' [ + | - ] hh:mm' | DBTIMEZONE | SESSIONTIMEZONE | 'time_zone_name' | expr
}
}
datetime_datatypes::= { DATE
| TIMESTAMP [( fractional_seconds_precision )] [WITH [LOCAL] TIME ZONE] )
| INTERVAL YEAR [( year_precision )] TO MONTH
| INTERVAL DAY [( day_precision )] TO SECOND [( fractional_seconds_precision )]
}
large_object_datatypes::= { BLOB | CLOB | NCLOB | BFILE }
rowid_datatypes::= { ROWID | UROWID [( size )] }
ANSI_supported_datatypes::= { CHARACTER [VARYING] ( size )
| { CHAR | NCHAR } VARYING ( size )
| VARCHAR ( size )
| NATIONAL { CHARACTER | CHAR } [VARYING] ( size )
| { NUMERIC | DECIMAL | DEC } [( precision [, scale] )]
| { INTEGER | INT | SMALLINT }
| FLOAT [( size )]
| DOUBLE PRECISION
| REAL
}
B. Création de tables
create_table::= relational_table
relational_table::= CREATE [GLOBAL TEMPORARY] TABLE [schema .] table
[( relational_properties )] [ON COMMIT { DELETE | PRESERVE } ROWS]
[physical_properties];
relational_properties::= { column datatype [DEFAULT expr]
[ inline_constraint [inline_constraint]...]
| out_of_line_constraint
}
[, { column datatype [DEFAULT expr]
[ inline_constraint [inline_constraint]...]
| out_of_line_constraint
]...
inline_constraint::= [CONSTRAINT constraint_name]
{ [NOT] NULL
| UNIQUE
| PRIMARY KEY
| references_clause
| CHECK ( condition )
} [constraint_state]
out_of_line_constraint::= [CONSTRAINT constraint_name]
{ UNIQUE ( column [, column]... )
| PRIMARY KEY ( column [, column]...
| FOREIGN KEY ( column [, column]... references_clause
| CHECK ( condition )
} [constraint_state]
references_clause::= REFERENCES [schema .] { object_table | view } [ (column [, column]...) ]
[ON DELETE { CASCADE | SET NULL }] [constraint_state]
constraint_state::= [ [[NOT] DEFERRABLE] [INITIALLY { IMMEDIATE | DEFERRED }]
| [INITIALLY { IMMEDIATE | DEFERRED }] [[NOT] DEFERRABLE]
]
[ ENABLE | DISABLE ]
[ VALIDATE | NOVALIDATE ]
physical_properties::= { segment_attributes_clause [data_segment_compression]
| ORGANIZATION
{ HEAP [segment_attributes_clause] [data_segment_compression]
| INDEX [segment_attributes_clause] index_org_table_clause
}
| CLUSTER cluster ( column [, column]... )
}
segment_attributes_clause::= { TABLESPACE tablespace | logging_clause }
[TABLESPACE tablespace | logging_clause ]...
data_segment_compression::= { COMPRESS | NOCOMPRESS }
logging_clause::= {LOGGING | NOLOGGING}
index_org_table_clause::= [{ mapping_table_clauses | PCTTHRESHOLD integer | key_compression }
[ mapping_table_clauses | PCTTHRESHOLD integer | key_compression ]...
]
[index_org_overflow_clause]
C. Modification de tables
alter_table::= ALTER TABLE [schema .] table
{ column_clauses
| constraint_clauses
}
[{ enable_disable_clause | { ENABLE | DISABLE } { TABLE LOCK | ALL TRIGGERS } }
[ enable_disable_clause | { ENABLE | DISABLE } { TABLE LOCK | ALL TRIGGERS } ]...
]
;
column_clauses::= { { add_column_clause | modify_column_clause | drop_column_clause }
[ add_column_clause | modify_column_clause | drop_column_clause ]...
| rename_column_clause
}
add_column_clause::= ADD { ( column datatype [DEFAULT expr]
[inline_constraint [inline_constraint]...]
) }
[, { ( column datatype [DEFAULT expr] [inline_constraint [inline_constraint]...] ) }
]...
modify_column_clause::= MODIFY modify_col_properties
modify_col_properties::= ( column [datatype] [DEFAULT expr]
[ inline_constraint [inline_constraint]... ]
[, column [datatype] [DEFAULT expr] [ inline_constraint [inline_constraint] ... ] ]
)
drop_column_clause::= { SET UNUSED { COLUMN column | ( column [, column]... ) }
[{ CASCADE CONSTRAINTS | INVALIDATE } [ CASCADE CONSTRAINTS | INVALIDATE ]...]
| DROP { COLUMN column | ( column [, column]... ) }
[{ CASCADE CONSTRAINTS | INVALIDATE } [ CASCADE CONSTRAINTS | INVALIDATE ]...]
| DROP { UNUSED COLUMNS | COLUMNS CONTINUE }
}
rename_column_clause::= RENAME COLUMN old_name TO new_name
constraint_clauses::= { ADD {out_of_line_constraint [out_of_line_constraint]... }
| MODIFY CONSTRAINT constraint constraint_state
| RENAME CONSTRAINT old_name TO new_name
| drop_constraint_clause
}
drop_constraint_clause::= DROP
{ { PRIMARY KEY | UNIQUE ( column [, column]... ) }
[CASCADE] [{ KEEP | DROP } INDEX]
| CONSTRAINT constraint [CASCADE]
}
enable_disable_clause::= { ENABLE | DISABLE } [ VALIDATE | NOVALIDATE ]
{ UNIQUE ( column [, column]... )
| PRIMARY KEY
| CONSTRAINT constraint
}
D. Suppression de tables
drop_table::= DROP TABLE [schema .] table [CASCADE CONSTRAINTS];
truncate_table::= TRUNCATE TABLE [schema .] table [{ DROP | REUSE } STORAGE];
B. Mises à jour
update::= UPDATE
{ dml_table_expression_clause | ONLY ( dml_table_expression_clause ) }
[t_alias] update_set_clause [where_clause];
update_set_clause::= SET
{ { ( column [, column]... ) = ( subquery )
| column = { expr | ( subquery ) | DEFAULT }
}
[, { ( column [, column]... ) = ( subquery )
| column = { expr | ( subquery ) | DEFAULT }
}
]...
| VALUE ( t_alias ) = { expr | ( subquery ) }
}
where_clause::= WHERE condition
C. Suppression de données
delete::= DELETE [FROM]
{ dml_table_expression_clause | ONLY ( dml_table_expression_clause ) }
[t_alias] [where_clause];
V. Schéma physique
A. Création
create_index::= CREATE [ UNIQUE | BITMAP ] INDEX [schema .] index ON
{ cluster_index_clause | table_index_clause | bitmap_join_index_clause };
cluster_index_clause::= CLUSTER [schema .] cluster index_attributes
table_index_clause::= [schema .] table [t_alias]
( index_expr [ ASC | DESC ] [, index_expr [ ASC | DESC ]]... )
[ index_attributes ]
bitmap_join_index_clause::= [schema .] table
( [schema .] [table] column [ ASC | DESC ]
[, [schema .] [table] column [ ASC | DESC ]]...
)
FROM [schema .] table [, [schema .] table]... WHERE condition
index_attributes
index_attributes::= [{ | logging_clause
| ONLINE | COMPUTE STATISTICS
| TABLESPACE { tablespace | DEFAULT }
| key_compression
| { NOSORT | REVERSE }
}
[ logging_clause
| ONLINE | COMPUTE STATISTICS
| TABLESPACE { tablespace | DEFAULT }
| key_compression
| { NOSORT | REVERSE }
]...
]
index_expr::= { column | column_expression }
create_cluster::= CREATE CLUSTER [schema .] cluster ( column datatype [, column datatype]... )
[{ SIZE integer [ K | M ]
| TABLESPACE tablespace
| { INDEX | [SINGLE TABLE] HASHKEYS integer [HASH IS expr] }
}
[ SIZE integer [ K | M ]
| TABLESPACE tablespace
| { INDEX | [SINGLE TABLE] HASHKEYS integer [HASH IS expr] }
]...
];
B. Suppression
drop_index::= DROP INDEX [schema .] index [FORCE];
drop_cluster::= DROP CLUSTER [schema .] cluster [INCLUDING TABLES [CASCADE CONSTRAINTS]];
VII. Confidentialité
grant::= GRANT { grant_system_privileges | grant_object_privileges } ;
grant_system_privileges::= { system_privilege | role | ALL PRIVILEGES }
[, { system_privilege | role | ALL PRIVILEGES }]...
TO grantee_clause [IDENTIFIED BY password] [WITH ADMIN OPTION]
grant_object_privileges::= { object_privilege | ALL [PRIVILEGES] } [( column [, column]... )]
[, { object_privilege | ALL [PRIVILEGES] } [( column [, column]... )]]...
on_object_clause
TO grantee_clause
[WITH GRANT OPTION] [WITH HIERARCHY OPTION]
on_object_clause::= [ schema ] . object
grantee_clause::= { user | role | PUBLIC } [, { user | role | PUBLIC }]...
revoke::= REVOKE { revoke_system_privileges | revoke_object_privileges }
[, { revoke_system_privileges | revoke_object_privileges } ]...;
revoke_system_privileges::= { system_privilege | role | ALL PRIVILEGES }
[, { system_privilege | role | ALL PRIVILEGES }]...
FROM grantee_clause
revoke_object_privileges::= { object_privilege | ALL [PRIVILEGES] } [( column [, column]... )]
[, { object_privilege | ALL [PRIVILEGES] } [( column [, column]... )]]...
on_object_clause FROM grantee_clause [CASCADE CONSTRAINTS] [FORCE]
create_role::= CREATE ROLE role
[ NOT IDENTIFIED
| IDENTIFIED { BY password | USING [schema .] package | EXTERNALLY | GLOBALLY }
]
;
create_user::= CREATE USER user IDENTIFIED
{ BY password | EXTERNALLY | GLOBALLY AS 'external_name' }
[{ DEFAULT TABLESPACE tablespace
| TEMPORARY TABLESPACE tablespace
| QUOTA { integer [ K | M ] | UNLIMITED } ON tablespace
[QUOTA { integer [ K | M ] | UNLIMITED } ON tablespace]...
| PROFILE profile
| PASSWORD EXPIRE
| ACCOUNT { LOCK | UNLOCK }
}
[ DEFAULT TABLESPACE tablespace
| TEMPORARY TABLESPACE tablespace
| QUOTA { integer [ K | M ] | UNLIMITED } ON tablespace
[QUOTA { integer [ K | M ] | UNLIMITED } ON tablespace]...
| PROFILE profile
| PASSWORD EXPIRE
| ACCOUNT { LOCK | UNLOCK }
]...
]
;