Question

Est-ce que Oracle a un outil que je peux utiliser pour analyser une base de données et aider à déterminer les relations de terrain possibles manquants? Nous avons une base de données existante avec 150+ tables et de nombreuses relations manquent. Nous pourrions passer par la main, mais un outil automatisé pourrait être utile. Donc, trouver des choses comme les clés étrangères manquantes et ainsi de suite.

Était-ce utile?

La solution

J'ai dû faire cela quelques fois. Je trouve que c'est un très gentil intelligence humaine de chose - aidé en exécutant un grand nombre de requêtes à travers à la fois le dictionnaire de données (la requête de par exemple EvilTeach), l'interrogation des données d'échantillon à partir des colonnes, examiner la façon dont les données sont créées par l'application et la compréhension de la exigences opérationnelles et les processus utilisateur.

Par exemple, dans de nombreuses applications existantes, je trouve des contraintes (y compris les contraintes d'intégrité référentielle) qui sont vérifiées et mises en œuvre dans l'application front-end, ce qui signifie que les données suivent la contrainte (près de 100% :)) mais il est pas vraiment contraint au niveau de la base de données. Beaucoup de résultats amusants.

Je serais surpris si un outil pourrait faire tout cela automatiquement et produire des résultats utiles.

Autres conseils

Cela pourrait être un bon début

select column_name, table_name, data_type
from user_tab_cols
order by column_name, table_name

Vous pourriez trouver une éventuelle absence de clé étrangère si vous supposez que vous pouvez identifier une relationshinp clé POSSIBLE étrangère en trouvant des colonnes avec les noms et les mêmes types de données dans des tables différentes, dont l'une est une clé primaire, et un autre n'a pas de référence à cette clé.

Vous pouvez utiliser une requête comme ceci:

select c1.TABLE_NAME, c1.COLUMN_NAME, c2.TABLE_NAME, c2.COLUMN_NAME
  from user_tab_columns c1,
       user_tables      at1,
       user_tab_columns c2,
       user_tables      at2
 where c1.COLUMN_NAME = c2.COLUMN_NAME
   and c1.DATA_TYPE = c2.DATA_TYPE
   and c1.TABLE_NAME = at1.TABLE_NAME
   and c2.TABLE_NAME = at2.TABLE_NAME
   and c1.TABLE_NAME != c2.TABLE_NAME
   /*and c1.TABLE_NAME = 'TABLE' --check this for one table
     and c1.COLUMN_NAME = 'TABLE_PK'*/
   and not exists (select 1
          from user_cons_columns ucc,
               user_constraints  uc,
               user_constraints  uc2,
               user_cons_columns ucc2
         where ucc.CONSTRAINT_NAME = uc.CONSTRAINT_NAME
           and uc.TABLE_NAME = ucc.TABLE_NAME
           and ucc.table_name = c1.TABLE_NAME
           and ucc.column_name = c1.COLUMN_NAME
           and uc.CONSTRAINT_TYPE = 'P'
           and uc2.table_name = c2.TABLE_NAME
           and ucc2.column_name = c2.COLUMN_NAME
           and uc2.table_name = ucc2.table_name
           and uc2.r_constraint_name = uc.constraint_name
           and uc2.constraint_type = 'R')

Celui-ci (un croquis, optimisé en aucune façon, cependant) balaye à travers toutes les paires de colonnes égalité nom de type, et trouve si l'on est un PK, et l'autre ne fait référence pas.

Mais, et là je suis d'accord avec Jeffrey, c'est un très gentil intelligence humaine de chose, et aucun outil fera pour vous. Dans tous les cas, vous devrez le faire manuellement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top