Ferramenta Oracle inteligente para encontrar relacionamentos de campo ausentes

StackOverflow https://stackoverflow.com/questions/3815744

  •  26-09-2019
  •  | 
  •  

Pergunta

O Oracle tem uma ferramenta que posso usar para analisar um banco de dados e ajudar a determinar possíveis relacionamentos de campo ausentes? Temos um banco de dados herdado com mais de 150 tabelas e muitos relacionamentos estão faltando. Poderíamos passar por isso à mão, mas uma ferramenta automatizada pode ser útil. Então, encontre coisas como perder as chaves estrangeiras e outros enfeites.

Foi útil?

Solução

Eu tive que fazer isso algumas vezes agora. Acho que é um tipo de coisa de inteligência humana - ajudada executando muitas consultas no dicionário de dados (por exemplo, consulta de Evilteach), consultando dados de amostra das colunas, examinando como os dados são criados pelo aplicativo e compreendendo os Requisitos de negócios e processos de usuário.

Por exemplo, em muitos aplicativos legados, encontro restrições (incluindo restrições de integridade referencial) que são verificadas e implementadas no aplicativo front-end, o que significa que os dados seguem a restrição (quase 100% :)), mas não é realmente restrito no banco de dados nível. Muitos resultados divertidos.

Eu ficaria surpreso se uma ferramenta pudesse fazer isso automaticamente e produzir resultados úteis.

Outras dicas

Este pode ser um bom começo

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

Você pode encontrar uma possível ausência de chave estrangeira se assumir que pode identificar uma possível relação de chave estrangeira, encontrando colunas com nomes iguais e tipos de dados em tabelas diferentes, uma das quais é uma chave primária e outra não tem referência a essa chave .

Você pode usar uma consulta como esta:

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')

Este (um esboço, otimizado de forma alguma) digitaliza todos os pares de igualdade do tipo de nome da coluna e descobre se um é um PK e outro não o referencia.

Mas, e aqui eu concordo com Jeffrey, é um tipo de coisa de inteligência humana, e nenhuma ferramenta fará isso com certeza. De qualquer forma, você terá que fazer isso à mão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top