Le Dictionnaire de données (ou référentiel) Oracle

Définition et accès au dictionnaire

D'une manière générale il est utile de connaitre un minimum du contexte des données que l'on souhaite consulter ou mettre à jour. La liste de mes tables, lesnoms et types des colonnes d'une de mes tables, les tables accessibles, etc.
Ces informations qui concernent les informations, sont appelées méta données (ou META DATA).
Suivenat les bases de données, on peut y avoir accès soit via une interface graphique, via des commandes spécifiques simples, ou + simplement encore via des SELECT si les méta données sont stockées dans des tables relationnelles.

Pour se faire une idée on a ici un aperçu de l'accès aux méta données des principaux SGBDs du marché. et un petit zoom sur les meta data MySQL

Le dictionnaire de données (DD) est le référentiel unique qui décrit tous les objets physiques et logiques d'une base de données Oracle. Il est accédé implicitement par le noyau Oracle et explicitement par les utilisateurs DBA ou non.
Par exemple lorsque l'on crée une table le noyau insère automatiquement une ligne descriptive dans la table des tables.
Le dictionnaire est organisé en tables et en vues, ce qui implique que son interrogation peut se faire en SQL !

remarque : il est interdit à un utilisateur même DBA d'écrire explicitement dans le dictionnaire.

Contenu du dictionnaire

Le dictionnaire est composé de tables appartenant a SYS, et dont le nom se termine en général par un '$ (SYS.TAB$ la table des tables, SYS.TS$ la table des tablespaces , etc.) .
Pour des raisons de confort et de sécurité, on n'accède pratiquement jamais à ces tables en direct, on passe par l'intermétiaire de vues plus lisibles.

Les vues les plus couramment utilisées sont des vues statiques. Elles décrivent les :
tablespaces, fichiers physiques, tables, contraintes, clusters, vues, index, synonymes, procédures, fonctions, packages, triggers, utilisateurs, droits d'accès, rôles, profils, audits, etc...
Il existe également des vues dynamiques, concernant essentiellemnt les ressources système en cours d'utilisation, les ressources Oracle en cours d'utilisation, les sessions connectées, les verrous, etc. C'est ce qu'on appelle les vues et tables virtuelles.
Toutes les tables et vues du dictionnaire appartiennent à SYS. Elles sont consultables suivant le profil de l'utilisateur.

Les vues statiques

Il existe 3 catégories de vues (reconnaissables par leur préfixe) :

USER_XXX : décrit les objets appartenant à l'utilisateur connecté
ALL_XXX : décrit les objets accessibles à l'utilisateur connecté
DBA_XXX : décrit tous les objets (vues autorisées aux DBAs seulement...)

chaque XXX est en général remplacé par un nom (en anglais) significatif. Ainsi USER_TABLES est la vue de toutes MES tables, DBA_SYNONYMS est la vue de TOUS les synonymes du système.
Une (méta) description du dictionnaire est donnée par la vue DICT.

Attention ! suivant les principes de préfixage évoqués ci-dessus, les vues commençant par 'ALL_' ne décrivent pas TOUS les objets mais les objets ACCESSIBLES à l'utilisateur courant. Ainsi ALL_TABLES ne donne pas la liste de toutes les tables de la base, c'est DBA_TABLES !

Un exemple détaillé : la vue DBA_USERS

On peut regarder dans la vue DICT comment est décrite la VUE DBA_USERS :

select * from DICT
where table_name= 'DBA_USERS'

TABLE_NAME COMMENTS
DBA_USERS Information about all users of the database

DBA_USERS est en fait un synonyme public qui pointe sur la vue SYS.DBA_USERS qui est une jointure des tables SYS.USERS$, SYS.TS$, etc.

Pour une description plus détaillée on peut faire un DESCRIBE de la table sous SQL*PLus (WorkSheet / i*SQLPlus) :

DESCRIBE DBA_USERS

Nom NULL ? Type
USERNAME NOT NULL VARCHAR2(30)
USER_ID NOT NULL NUMBER
PASSWORD   VARCHAR2(30)
ACCOUNT_STATUS NOT NULL VARCHAR2(32)
LOCK_DATE   DATE
EXPIRY_DATE   DATE
DEFAULT_TABLESPACE NOT NULL VARCHAR2(30)
TEMPORARY_TABLESPACE NOT NULL VARCHAR2(30)
CREATED NOT NULL DATE
PROFILE NOT NULL VARCHAR2(30)
INITIAL_RSRC_CONSUMER_GROUP   VARCHAR2(30)
EXTERNAL_NAME   VARCHAR2(4000)

et apothéose on peut voir quel est la définition exacte de cette vue (le texte du SELECT) dans le dictionnaire, et on s'aperçoit que c'est encore + compliqué qu'il n'y parait (c'est souvent comme ça dans la nature) :

SQL> SET LONG 2000
SQL> select text from dba_views
where view_name ='DBA_USERS'

TEXT
SELECT u.name, u.user#, u.password, m.status, decode(u.astatus, 4, u.ltime, 5, u.ltime, 6, u.lti me, 8, u.ltime, 9, u.ltime, 10, u.ltime, to_date(NULL)), decode(u.astatus, 1, u.exptime, 2, u.exptime, 5, u.exptime, 6, u.exptime, 9, u.exptime, 10, u.exp time, decode(u.ptime, '', to_date(NULL), decode(pr .limit#, 2147483647, to_date(NULL), decode(pr.limit#, 0, decode(dp.limit#, 2147483647, to_date(NULL), u.ptime + dp.limit#/86400), u.ptime + pr.limit#/86400)))), dts.name, tts.name, u.ctime, p.name, u.defschclass, u.ext_username
FROM sys.user$ u, sys.ts$ dts, sys.ts$ tts, sys.profname$ p, sys.user_ astatus_map m, sys.profile$ pr, sys.profile$ dp
WHERE u.datats# = dts.ts# and u.resource$ = p.profile# and u.tempts# = tts.ts# and u .astatus = m.status# and u.type# = 1 and u.resource$ = pr.profile# and dp.profile# = 0 and dp.type#=1 and dp.resource#=1 and pr.type# = 1 and pr.resource# = 1

Les vues dynamiques

Pour information leur nom commence par 'V_$' et appartiennent (comme les autres) a SYS. Il existe des synonymes publics pour ces vues qui commence par un 'V$'. Elles sont surtout utiles pour la surveuillance en temps réel du système ou pour faire du tuning.

Quelques vues dynamiques utiles au DBA :

V$VERSION

V$DATABASE

V$SESSION

v$LOCK

v$SGA

V$SQL

V$SYSSTAT

Nom du composant logiciel et no de version du noyau Oracle

Infos générales sur la base (nom, control files, reset logs, checkpoints, etc)

Infos sur les sessions actuellement connectées

Les verrous actifs et en attente

Taille et composition de la mémoire partagée

Ordres SQL en cache

Statistiques système

Liste des différentes vues du dictionnaire

Si vous ne vous rappelez aucun nom de vues du dictiuonnaire, pour avoir un aperçu de son contenu, taper sous SQL*Plus : SQL> SELECT * FROM DICT ;

SI vous voulez connaitre la structure (les colonnes) des vues du dictionnaire, il suffit de faire un DESC sous SQL+. Par exemple :
SQL > DESCRIBE v$session
SQL> DESCRIBE USER_TABLES

Pour plus d'infos voir dans la doc ou sur OTN, le manuel nommé 'reference' qui décrit ehaustivement le dictionnaire Oracle.



modifié
le 20/11/2006

Ecrire a DD
ecris
moi


les forums techniques Oracle

mon BLOG Oracle,
en Francais
connaitre DD
l'autre vie
de DD

mon CV

trucs
et astuces

JOBs Oracle
du jour
Homepage "Tout sur Oracle"
Mon site :
Tout sur Oracle (et le web)
Copyright (C) 2002
Utilisation de ces documents