Vous êtes sur la page 1sur 9

Atelier Administration Bases de Données

Atelier 4 : Tables, Indexes et Contraintes d'intégrité

Objectifs de l'atelier :
A la fin de cet atelier, l’étudiant doit être capable de :

 Créer des tables en les plaçant dans des tablespaces,


 Consulter la quantité d'espace occupée par les tables,
 Créer des index de type B*Tree et Bitmap,
 Choisir le type d'index à créer selon la nature des données de
la colonne,
  Reconstruire les index,
 Créer les différents types de contraintes d'intégrité,
 Activer et désactiver les contraintes d'intégrité.

Enoncé :

Gestion des Tables


1. En tant que SYSTEM, créez les tables suivantes pour un système de gestion
de commandes. Les tables et les colonnes sont indiquées ci-dessous :
Table Colonnes Type de données

CLIENTS CODE_CLI VARCHAR2(3)

NOM VARCHAR2(50)

REGION VARCHAR2(5)

COMMANDES ID_COM NUMBER(3)

DATE_COM DATE

CODE_CLI VARCHAR2(3)

DATE_LIV DATE

Dans la table commandes les lignes seront insérées sans valeur pour DATE_LIV, car cette
colonne sera mise à jour lorsque la commande sera satisfaite. Connectez-vous en tant que
system/manager et créez les tables. Utilisez le tablespace USERS, vous pouvez utilisez es
paramètres de stockage par défaut.

SQL> connect system/votre_mot_de_passe

SQL> create table clients(

code_cli varchar2(3),

Page 1|9
Atelier Administration Bases de Données

nom_cli varchar2(50),

region varchar2(10))

tablespace USERS;

SQL> create table commandes(

id_com number(3),

date_com date,

code_cli varchar2(3),

date_liv date) tablespace USERS;

2. Exécutez le script ins_cord.sql (fourni par votre enseignant) pour insérer des lignes
dans les tables (créez le dossier c:\dba et y placez tous les fichiers de script qui
vous ont été fournis):
SQL> start c:\dba\ins_cord.sql

Ou bien

SQL> @c:\dba\ins_cord.sql

3. Recherchez les fichiers et les blocs contenant les lignes de la table commandes
SQL> select file_id, block_id, blocks

from dba_extents

where owner='SYSTEM'

and segment_name='COMMANDES'

and segment_type='TABLE';

4. Vérifiez le nombre d’extents utilisés par la table COMMANDES :


SQL> select count(*)

from dba_extents

where segment_name='COMMANDES'

and owner='SYSTEM';

5. Manuellement, allouez un extent avec une taille par défaut à la table Commandes
et vérifiez que l’opération a abouti.
SQL> alter table commandes allocate extent;

SQL> select count(*)

from dba_extents

where segment_name='COMMANDES'
Page 2|9
Atelier Administration Bases de Données

and owner='SYSTEM';

6. Affichez les colonnes de la table commandes. Marquez la colonne Date_liv comme


UNUSED. Affichez à nouveau les colonnes de cette table. Que se passe-t-il ?
SQL> desc commandes

SQL> alter table commandes

set unused column date_liv

cascade constraints;

SQL> desc commandes

7. Supprimez les colonnes non utilisées de la table commandes


SQL> alter table commandes drop unused columns;

Gestion des Index


8. Créez l'index B*Tree (type d'index par défaut) appelé NOM_IDX sur la colonne
NOM_CLI en le plaçant dans le tablespace INDX01.
SQL> create index clt_nom_idx

on clients (NOM_CLI)

tablespace INDX01;

9. Créez l'index Bitmap, appelé CLT_REGION_IDX sur la colonne clt_region_idx en le


plaçant dans le tablespace INDX01.
SQL> create bitmap index clt_region_idx

on clients(region)

tablespace INDX01;

10. Déplacez l’index CLT_REGION_IDX dans un autre tablespace. (L’index peut être
reconstruit en spécifiant un autre tablespace) :
SQL> alter index clt_region_idx REBUILD tablespace DATA02;

11. Notez les fichiers et les blocks utilisés par les extents par l’index CLT_REGION_IDX
(utilisez la vue dba_extents) :
SQL> select file_id, block_id, blocks

from dba_extents

where segment_name='CLT_REGION_IDX'
and owner='SYSTEM';

Page 3|9
Atelier Administration Bases de Données

12. Recréez l’index CLT_REGION_IDX, sans le supprimer avant de le recréer, en le gardant


dans le même tablespace. Le nouvel index utilise-t-il les mêmes blocs que précédemment ?
SQL> alter index clt_region_idx REBUILD;

SQL> select file_id, block_id, blocks

from dba_extents

where segment_name='CLT_REGION_IDX'

and owner='SYSTEM';

Le nouvel index ne réutilise pas le même espace. Ceci car le serveur Oracle construit un
index temporaire, supprime l’ancien et renomme l’index temporaire.

13. Toujours sous l’utilisateur SYSTEM, exécuter le script c:\DBA\numbers.sql pour créer la
table Numbers et l’alimenter.
SQL>start c:\DBA\numbers.sql

14. Interrogez la table Numbers pour déterminer le nombre de valeurs distinctes dans les deux
colonnes de la table.
SQL> select count(distinct NO) NO,

count(distinct OE) OE

from numbers;

15. Créez les indexes B*Tree Numb_OE_IDX et NUMB_NO_IDX, respectivement sur les
colonnes OE et NO de la table Numbers. Placez ces indexes dans le tablespace
INDX01.Vérifiez la taille totale des indexes et écrivez ci-dessous le nombre de blocs :
SQL> create index numb_oe_idx

on numbers(oe)

tablespace INDX01;

SQL> create index numb_no_idx

on numbers(no) tablespace INDX01;

SQL> column segment_name format a15

SQL> select segment_name, blocks

from dba_segments

where segment_name LIKE 'NUMB%'

and segment_type='INDEX';

Index Colonnes Blocs

Page 4|9
Atelier Administration Bases de Données

NUMB_OE_IDX OE …………………

NUMB_NO_IDX NO …………………

16. Après avoir enregistré les blocs ci-dessus, vous devez supprimer les indexes
numb_oe_idx et numb_no_idx. Créez les index bitmap numb_oe_idx et numb_no_idx,
respectivement sur les colonnes OE et NO de la table Numbers. Placez les dans le
tablespace INDX01.Exécutez, de nouveau, l’interrogation sur DBA_EXTENTS pour
vérifier le nombre total de blocs alloués aux extents. Vérifiez la taille totale des indexes
et écrivez ci-dessous le nombre de blocs :

Index Colonnes Blocs

NUMB_OE_IDX OE …………………

NUMB_NO_IDX NO …………………

SQL> create bitmap index numb_oe_idx

on numbers(oe) tablespace INDX01;

SQL> create bitmap index numb_no_idx

on numbers(no) tablespace INDX01;

SQL> select segment_name, blocks

from dba_segments

where segment_name LIKE 'NUMB%'

and segment_type='INDEX';

Que pouvez-vous conclure de la relation entre la cardinalité et la taille des deux indexes ?

Réponse :

Les résultats révèlent que les indexes bitmap et B*tree sont compacts, respectivement pour
une colonne de faible cardinalité et pour une colonne de forte cardinalité.

Les contraintes d''intégrité


17. Examinez le script cr_cons.sql, exécutez le afin de créer les contraintes
SQL>start c:\dba\cr_cons.sql

Page 5|9
Atelier Administration Bases de Données

18. Consultez le dictionnaire de données afin de :


a. Vérifier si les contraintes peuvent être différées, ainsi que leurs statuts. (utilisez
la vue dba_constraints) :
SQL> select constraint_name, table_name, constraint_type, status

from dba_constraints

where table_name in ('CLIENTS','COMMANDES','PRODUITS');

b. Vérifiez le nom et le type d’index créés pour valider les


contraintes : SQL> select index_name, table_name, uniqueness

from dba_indexes

where index_name in

(select constraint_name

from dba_constraints

where table_name in ('CLIENTS','COMMANDES', 'PRODUITS')

and owner='SYSTEM'

and constraint_type in ('P','U'));

19. Insérez deux lignes dans la table produit avec les valeurs suivantes :
Code_prod Description prix

100960 Raquette Tennis 36.20

100960 Ball de tennis 2.40

SQL> insert into produits values (100960,'Raquette de Tennis',36.2);

SQL> insert into produits values (100960,'Ball de Tennis',2.4);

20. Activez la contrainte Unique sur la table Produits. A-t-elle abouti ?


SQL> alter table produits enable constraint prod_uk;

La contrainte ne peut pas être activée car il y a des lignes qui la violent

21. Assurez-vous que les lignes ajoutées désormais à la table ne violeront plus la contrainte
prod_uk (Utilisez l'option ENABLE NOVALIDATE), l'option

NOVALIDATE n'exigent pas que les lignes existantes respectent la contrainte, mais
les nouelles lignes qui seront ajoutées devront respecter la contrainte)
SQL> alter table produits enable NOVALIDATE constraint prod_uk;

22. Consultez le dictionnaire de données pour vérifier les effets de la modification :


SQL> column constraint_name format a10
Page 6|9
Atelier Administration Bases de Données

SQL> column table_name format a10

SQL> select constraint_name, table_name, constraint_type, validated, status

from dba_constraints

where table_name ='PRODUITS';

23. Testez la contrainte PROD_UK en ajoutant une ligne avec les valeurs suivante :
  CODE_PROD : 100960
 DESCRIPTION : Bicyclette Jaune
 PRIX : 200
SQL> insert into produits values (100960,'Bicyclette Jaune',200);

24. Suivez les étapes nécessaires à l’identification des violations de la contrainte prod_uk de
la table PRODUITS ; modifiez le cas échéant, les codes de produits et assurez-vous que les
données existantes, ainsi que les nouvelles ne violent pas la contrainte. (Supposez que la
table contient plusieurs milliers de lignes et il serait trop long de faire ça manuellement) On
va suivre alors les étapes suivantes :

a. Sous SYSTEM, Créez la table EXCEPTIONS, en exécutant le fichier utlexcpt.sql qui se


trouve dans le dossier D:\app\NADHEM\product\11.2.0\dbhome_1\RDBMS\ADMIN,
en supposant, ici que "D:\app\NADHEM\product\11.2.0\dbhome_1\" est la valeur de
ORACLE_HOME (comme ORACLE_BASE, ORACLE_HOME est une clé des registres
Windows). ORACLE_HOME pointe sur le dossier ou est installé le logiciel Oracle. Ce
dossier n'est pas fixe et dépond de votre installation. Pour le connaître :
i. Exécuter la commande regedit
ii. Aller dans
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_HOME_NAME
iii. Consulter la valeur de la clé ORACLE_HOME

SQL> start ORACLE_HOME\RDBMS\ADMIN\utlexcpt.sql

b. Exécutez la commande pour activer la contrainte et détecter les exceptions :

SQL> alter table produits

enable constraint prod_uk

EXCEPTIONS INTO system.exceptions;

Page 7|9
Atelier Administration Bases de Données

c. Utilisez les ROWID dans la table EXCEPTIONS pour énumérer les lignes de la table
produits qui violent la contrainte :
SQL> select rowid, code_prod, description

from produits

where rowid in (select row_id

from exceptions

where table_name='PRODUITS');

d. Corrigez les erreurs


SQL> update produits

set code_prod='100961'

where rowid=(select max(row_id)

from exceptions

where table_name='PRODUITS');

SQL> select * from produits;

e. Activez la contrainte :
SQL> truncate table exceptions;

SQL> alter table produits

enable constraint prod_uk

exceptions into exceptions;

SQL> select * from exceptions;

aucune ligne sélectionnée

25. Insérez dans la table commandes une commande avec un code client inexistant :
SQL> insert into commandes values (123,'10/10/2006','C01',NULL);

insert into commandes values (123,'10/10/2006','C01',NULL)

ERREUR à la ligne 1 :
ORA-02291: violation de contrainte d'intégrité (SYSTEM.COM_CC_FK) - clé parent

Introuvable

26. Rendez toutes les contraintes « deffered » pour la session en cours :


SQL> alter session set CONSTRAINTS=deferred;

Session modifiée.
Page 8|9
Atelier Administration Bases de Données

27. Insérez dans la table commandes une commande avec un code client inexistant, puis
insérer ce client, enfin validez :
SQL> insert into commandes values (123,'10/10/2006','C01',NULL);

SQL> insert into clients values ('C01','Mohsen','sud');

SQL> COMMIT;

28. Videz la table clients. L’opération a-t-elle abouti ?


SQL> truncate table clients;

truncate table clients

ERREUR à la ligne 1 :

ORA-02266: les clés primaires/uniques de la table sont référencées par des clés étrangères

Page 9|9

Vous aimerez peut-être aussi