Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
Blog d'un DBA sur le SGBD Oracle et SQL
11 février 2017

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#


Publicité
Publicité
Commentaires
Blog d'un DBA sur le SGBD Oracle et SQL
Publicité
Archives
Blog d'un DBA sur le SGBD Oracle et SQL
  • Blog d'un administrateur de bases de données Oracle sur le SGBD Oracle et sur les langages SQL et PL/SQL. Mon objectif est de vous faire découvrir des subtilités de ce logiciel, des astuces, voir même des surprises :-)
  • Accueil du blog
  • Créer un blog avec CanalBlog
Visiteurs
Depuis la création 340 848
Publicité