Les types d’objets d'une base de données Oracle - The object types of an Oracle database
Introduction
Une base de données Oracle renferme bien plus de types d'objets qu'un DBA débutant voir même confirmé peut imaginer. Nous manipulons tellement souvent les tables, vues, séquences et autres objets communs du bestiaire Oracle que nous pensons tout connaître de la base. Grave erreur car en réalité Oracle met à notre disposition des dizaines de types d'objets différents, du plus commun au plus exotique; oui, je dis bien des dizaines et c'est ce que nous allons voir.
Points d'attention
Le but de ce post est juste de vous faire prendre conscience de l'incroyable richesse d'Oracle, pas de détailler les types d'objets un par un; pour cela, je vous renvoie vers la doc officielle Oracle.
Attention au fait suivant, tout ce que manipule un DBA dans Oracle n'est pas forcément considéré comme un objet! Par exemple, ne sont pas des objets les entités suivantes : USER, SCHEMA, TABLESPACE, SEGMENT... et bien d'autres encore. La notion d'objet est donc pour Oracle bien plus restrictive que celle dans le langage courant des DBA et développeurs.
Base de tests
N'importe quelle base Oracle.
Exemples
============================================================================================
Liste des types d'objets d'une base de données.
============================================================================================
L'ordre SQL pour voir les types d'objets d'une base de données est très simple car cette information est stockée dans la colonne OBJECT_TYPE de la vue DBA_OBJECTS.
Les deux ordres SQL sont identiques sauf que pour le premier le tri est fait par nombre décroissant de type d'objets et le deuxième par nom de type d'objet croissant.
Liste des types d'objets, classée par nombre décroissant.
SQL> SELECT OBJECT_TYPE, COUNT(*) FROM DBA_OBJECTS GROUP BY OBJECT_TYPE ORDER BY COUNT(*) DESC;
OBJECT_TYPE COUNT(*)
------------------- -----------------
SYNONYM 26078
JAVA CLASS 20634
INDEX 6553
TABLE 4685
VIEW 4152
TABLE PARTITION 2693
INDEX PARTITION 2340
TYPE 1467
SEQUENCE 919
LOB 866
JAVA RESOURCE 762
PACKAGE 682
PACKAGE BODY 655
TRIGGER 369
JAVA DATA 317
PROCEDURE 226
LIBRARY 163
FUNCTION 131
TYPE BODY 122
TABLE SUBPARTITION 32
XML SCHEMA 26
CONSUMER GROUP 25
QUEUE 23
PROGRAM 19
OPERATOR 15
JOB CLASS 14
RULE SET 13
JOB 12
UNDEFINED 11
RESOURCE PLAN 10
CLUSTER 10
WINDOW 9
EVALUATION CONTEXT 9
MATERIALIZED VIEW 8
DIRECTORY 5
CONTEXT 4
SCHEDULER GROUP 4
DATABASE LINK 3
SCHEDULE 3
INDEXTYPE 3
JAVA SOURCE 2
DESTINATION 2
LOB PARTITION 1
EDITION 1
RULE 1
45 rows selected.
Liste des types d'objets référencés par Oracle, classée par ordre alphabétique.
Cet ordre permet de voir aussi, par déduction, les "objets" qui n'en sont pas d'un point de vue strict Oracle comme dit précédemment : USER, SCHEMA...
SQL> SELECT OBJECT_TYPE, COUNT(*) FROM DBA_OBJECTS GROUP BY OBJECT_TYPE ORDER BY OBJECT_TYPE;
OBJECT_TYPE COUNT(*)
------------------- ----------------------------
CLUSTER 10
CONSUMER GROUP 25
CONTEXT 4
DATABASE LINK 3
DESTINATION 2
DIRECTORY 5
EDITION 1
EVALUATION CONTEXT 9
FUNCTION 131
INDEX 6553
INDEX PARTITION 2340
INDEXTYPE 3
JAVA CLASS 20634
JAVA DATA 317
JAVA RESOURCE 762
JAVA SOURCE 2
JOB 12
JOB CLASS 14
LIBRARY 163
LOB 866
LOB PARTITION 1
MATERIALIZED VIEW 8
OPERATOR 15
PACKAGE 682
PACKAGE BODY 655
PROCEDURE 226
PROGRAM 19
QUEUE 23
RESOURCE PLAN 10
RULE 1
RULE SET 13
SCHEDULE 3
SCHEDULER GROUP 4
SEQUENCE 919
SYNONYM 26078
TABLE 4685
TABLE PARTITION 2693
TABLE SUBPARTITION 32
TRIGGER 369
TYPE 1467
TYPE BODY 122
UNDEFINED 11
VIEW 4152
WINDOW 9
XML SCHEMA 26
45 rows selected.
Vous remarquerez le type d'objet UNDEFINED! D'après mes recherches sur le net, cela serait lié à des problèmes lors de la création de snapshots et de vues matérialisées.
============================================================================================
Liste des types d'objets supportés par Oracle.
============================================================================================
L'ordre SQL précédent ne liste que les types d'objets présents dans une base de données de test, soit 45 pour notre exemple. MAIS combien Oracle en gère t-il au juste? Pour cela, il faut afficher la définition de la vue DBA_OBJECTS pour constater que le champ OBJECT_TYPE est un long DECODE sur la colonne type# de la vue _CURRENT_EDITION_OBJ, qui elle même s'appuie sur la table système OBJ$.
Résultat, Oracle gère en 11g 62 types d'objets différents, si on inclut UNDEFINED.
Attention, il n'y en a pas 101 comme on pourrait le croire en utilisant la colonne _CURRENT_EDITION_OBJ.type# car des trous existent dans la numérotation, par exemple 10 et 15 sont absents.
SQL> SET LONG 1000000
SQL> SELECT DBMS_METADATA.GET_DDL('VIEW', 'DBA_OBJECTS') FROM DUAL;
DBMS_METADATA.GET_DDL('VIEW','DBA_OBJECTS')
------------------------------------------------------------------------------
CREATE OR REPLACE FORCE VIEW "SYS"."DBA_OBJECTS" ("OWNER", "OBJECT_NAME", "SUB
OBJECT_NAME", "OBJECT_ID", "DATA_OBJECT_ID", "OBJECT_TYPE", "CREATED", "LAST_DDL
_TIME", "TIMESTAMP", "STATUS", "TEMPORARY", "GENERATED", "SECONDARY", "NAMESPACE
", "EDITION_NAME") AS
select u.name, o.name, o.subname, o.obj#, o.dataobj#,
decode(o.type#,
0, 'NEXT OBJECT',
1, 'INDEX',
2, 'TABLE',
3, 'CLUSTER',
4, 'VIEW',
5, 'SYNONYM',
6, 'SEQUENCE',
7, 'PROCEDURE',
8, 'FUNCTION',
9, 'PACKAGE',
11, 'PACKAGE BODY',
12, 'TRIGGER',
13, 'TYPE',
14, 'TYPE BODY',
19, 'TABLE PARTITION',
20, 'INDEX PARTITION',
21, 'LOB',
22, 'LIBRARY',
23, 'DIRECTORY',
24, 'QUEUE',
28, 'JAVA SOURCE',
29, 'JAVA CLASS',
30, 'JAVA RESOURCE',
32, 'INDEXTYPE',
33, 'OPERATOR',
34, 'TABLE SUBPARTITION',
35, 'INDEX SUBPARTITION',
40, 'LOB PARTITION',
41, 'LOB SUBPARTITION',
42, NVL((SELECT 'REWRITE EQUIVALENCE'
FROM sum$ s
WHERE s.obj#=o.obj#
and bitand(s.xpflags, 8388608) = 8388608),
'MATERIALIZED VIEW'),
43, 'DIMENSION',
44, 'CONTEXT',
46, 'RULE SET',
47, 'RESOURCE PLAN',
48, 'CONSUMER GROUP',
51, 'SUBSCRIPTION',
52, 'LOCATION',
55, 'XML SCHEMA',
56, 'JAVA DATA',
57, 'EDITION',
59, 'RULE',
60, 'CAPTURE',
61, 'APPLY',
62, 'EVALUATION CONTEXT',
66, 'JOB',
67, 'PROGRAM',
68, 'JOB CLASS',
69, 'WINDOW',
72, 'SCHEDULER GROUP',
74, 'SCHEDULE',
79, 'CHAIN',
81, 'FILE GROUP',
82, 'MINING MODEL',
87, 'ASSEMBLY',
90, 'CREDENTIAL',
92, 'CUBE DIMENSION',
93, 'CUBE',
94, 'MEASURE FOLDER',
95, 'CUBE BUILD PROCESS',
100, 'FILE WATCHER',
101, 'DESTINATION',
'UNDEFINED'),
o.ctime, o.mtime,
to_char(o.stime, 'YYYY-MM-DD:HH24:MI:SS'),
decode(o.status, 0, 'N/A', 1, 'VALID', 'INVALID'),
decode(bitand(o.flags, 2), 0, 'N', 2, 'Y', 'N'),
decode(bitand(o.flags, 4), 0, 'N', 4, 'Y', 'N'),
decode(bitand(o.flags, 16), 0, 'N', 16, 'Y', 'N'),
o.namespace,
o.defining_edition
from sys."_CURRENT_EDITION_OBJ" o, sys.user$ u
where o.owner# = u.user#
and o.linkname is null
and (o.type# not in (1 /* INDEX - handled below */,
10 /* NON-EXISTENT */)
or
(o.type# = 1 and 1 = (select 1
from sys.ind$ i
where i.obj# = o.obj#
and i.type# in (1, 2, 3, 4, 6, 7, 9))))
and o.name != '_NEXT_OBJECT'
and o.name != '_default_auditing_options_'
and bitand(o.flags, 128) = 0
union all
select u.name, l.name, NULL, to_number(null), to_number(null),
'DATABASE LINK',
l.ctime, to_date(null), NULL, 'VALID','N','N', 'N', NULL, NULL
from sys.link$ l, sys.user$ u
where l.owner# = u.user#