Ferramenta Oracle inteligente para encontrar relacionamentos de campo ausentes
-
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.
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.