Consulta relações de chave estrangeira de uma tabela
Pergunta
Para uma determinada tabela 'foo', eu preciso de uma consulta para gerar um conjunto de tabelas que têm chaves estrangeiras que apontam para foo. Estou usando o Oracle 10g.
Solução
Isso deve funcionar (ou algo próximo):
select table_name
from all_constraints
where constraint_type='R'
and r_constraint_name in
(select constraint_name
from all_constraints
where constraint_type in ('P','U')
and table_name='<your table here>');
Outras dicas
A seguinte declaração deve dar as crianças e todos os seus descendentes. Eu testei-o em um banco de dados Oracle 10.
SELECT level, main.table_name parent,
link.table_name child
FROM user_constraints main, user_constraints link
WHERE main.constraint_type IN ('P', 'U')
AND link.r_constraint_name = main.constraint_name
START WITH main.table_name LIKE UPPER('&&table_name')
CONNECT BY main.table_name = PRIOR link.table_name
ORDER BY level, main.table_name, link.table_name
Aqui é como tirar consulta um passo de Mike ainda mais para obter os nomes coluna a partir dos nomes de restrição:
select * from user_cons_columns
where constraint_name in (
select constraint_name
from all_constraints
where constraint_type='R'
and r_constraint_name in
(select constraint_name
from all_constraints
where constraint_type in ('P','U')
and table_name='<your table name here>'));
Oracle Database Documentação online
Você pode querer explorar a Dados views de dicionário . Eles têm os prefixos:
- Usuário
- Todos
- DBA
Exemplo:
select * from dictionary where table_name like 'ALL%'
O exemplo de Continuing Mike, você pode querer gerar scripts para ativar / desativar as restrições. Eu só modificou a 'selecionar' na primeira linha.
select 'alter table ' || TABLE_NAME || ' disable constraint ' || CONSTRAINT_NAME || ';'
from all_constraints
where constraint_type='R'
and r_constraint_name in
(select constraint_name
from all_constraints
where constraint_type in ('P','U')
and table_name='<your table here>');
Eu sei que é meio tarde para resposta, mas deixe-me responder de qualquer maneira, algumas das respostas acima são bastante complicados, portanto, aqui está uma muito take mais simples.
`SELECT a.table_name child_table, a.column_name child_column, a.constraint_name, b.table_name parent_table, b.column_name parent_column FROM all_cons_columns a JOIN all_constraints c ON a.owner = c.owner AND a.constraint_name = c.constraint_name join all_cons_columns b on c.owner = b.owner and c.r_constraint_name = b.constraint_name WHERE c.constraint_type = 'R' AND a.table_name = 'your table name'`
select distinct table_name, constraint_name, column_name, r_table_name, position, constraint_type
from (
SELECT uc.table_name,
uc.constraint_name,
cols.column_name,
(select table_name from user_constraints where constraint_name = uc.r_constraint_name)
r_table_name,
(select column_name from user_cons_columns where constraint_name = uc.r_constraint_name and position = cols.position)
r_column_name,
cols.position,
uc.constraint_type
FROM user_constraints uc
inner join user_cons_columns cols on uc.constraint_name = cols.constraint_name
where constraint_type != 'C'
)
start with table_name = '&&tableName' and column_name = '&&columnName'
connect by nocycle
prior table_name = r_table_name
and prior column_name = r_column_name;
Baixe o Guia de Referência do Oracle para 10G o que explica as tabelas de dicionário de dados.
As respostas acima são bons, mas verificar as outras mesas que podem dizer respeito a restrições.
SELECT * FROM DICT WHERE TABLE_NAME LIKE '%CONS%';
Finalmente, ter uma ferramenta como o sapo ou SQL Developer, que permite que você navegue este material em uma interface do usuário, você precisa aprender a usar as tabelas, mas você deve usar uma interface de usuário também.