Information Schema do Oracle – Tabelas com determinada coluna
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:
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:
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.
