garotosopa

Information Schema do Oracle – Tabelas com determinada coluna

fazer um comentário »

Dica rápida para quem precisa de algo no Oracle parecido com o Information Schema do MySQL, para consultar informações sobre a própria base de dados.

No meu caso eu queria saber apenas quais tabelas tinham determinada coluna para me ajudar a identificar o impacto em cascata de apagar um registro, e a query foi bastante simples:

select table_name, column_name
from all_tab_columns
where owner=‘EAD’ AND column_name=‘ID_PESSOA’

Com esse resultado eu pude identificar todas as tabelas que têm a coluna id_pessoa e buscar pelo registro que eu viria a apagar da tabela principal.

Contudo, algumas tabelas referenciavam a pessoa mas utilizavam outro nome na coluna, como na tabela mensagem em que as colunas chamavam-se id_remetente e id_destinatario. Sendo assim, foi melhor buscar pela constraint em si, independente do nome da coluna:

select cl1.owner, cl1.table_name, cl1.column_name
from all_cons_columns cl1
join all_constraints c1 on cl1.constraint_name = c1.constraint_name
join all_constraints c2 on c1.r_constraint_name = c2.constraint_name
join all_cons_columns cl2 on c2.constraint_name = cl2.constraint_name
where cl2.table_name=‘PESSOA’ and cl2.column_name=‘ID’ 

Como eu já havia consultado as tabelas com colunas id_pessoa, acabei acrescentando o critério AND cl1.column_name != ‘ID_PESSOA’ para que retornasse apenas as constraints com a coluna com nome diferente apontando para a coluna id da tabela pessoa.

Infelizmente, tive que fazer as duas consultas separadamente, pois, tratando-se de um sistema legado, nem todas as referências tinham constraints. Agora, se alguma tabela fazia referência com uma coluna com nome diferente de id_pessoa e também não tinha constraint, já era :)

Se quiser, faça também um select na view DICT para saber tudo que tem disponível para consulta.

Escrito por garotosopa

agosto 6, 2010 às 4:09 pm

Publicado em Oracle, SQL

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.