it-swarm-pt.tech

Consultar relações de chave estrangeira de uma tabela

Para uma dada tabela 'foo', eu preciso de uma consulta para gerar um conjunto de tabelas que possuem chaves estrangeiras que apontam para foo. Estou usando o Oracle 10G.

22
Mark Roddy

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>'); 
41
Mike Monette

A seguinte declaração deve dar as crianças e todos os seus descendentes. Eu testei 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
4
richard.j.lewis

Veja como levar a consulta de Mike um passo adiante para obter os nomes das colunasdos nomes das restrições:

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>'));
2
matt1616

link para Documentação Online do Oracle Database

Você pode querer explorar as visualizações Data Dictionary . Eles têm os prefixos:

  • Do utilizador
  • Todos
  • DBA

amostra:

select * from dictionary where table_name like 'ALL%' 

Continuando o exemplo de Mike, você pode querer gerar scripts para ativar/desativar as restrições. Eu modifiquei apenas o 'select' 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>');
1
Tony R

Eu sei que é meio tarde para responder, mas deixe-me responder de qualquer maneira, algumas das respostas acima são bastante complicadas, por isso aqui é muito mais simples.

 `SELECT a.table_name child_table, a.column_name child_column, a.constraint_name, 
 B.table_nome parent_table, b.column_name parent_column 
 DE all_cons_columns a 
 JOIN all_constraints c ON a.owner = c.owner AND a.constraint_name = c.constraint_name 
 junte all_cons_columns b em c.owner = b.owner e c.r_constraint_name = b.constraint_name 
 ONDE c.constraint_type = 'R' 
 AND a.table_name = 'nome da sua mesa' »
1
arvnq

Faça o download do Guia de Referência do Oracle para 10G, que explica as tabelas de dicionário de dados.

As respostas acima são boas, mas confira as outras tabelas que podem estar relacionadas a restrições.

SELECT * FROM DICT WHERE TABLE_NAME LIKE '%CONS%';

Finalmente, obtenha uma ferramenta como o Toad ou o SQL Developer, que permite navegar por essas coisas em uma interface do usuário, você precisa aprender a usar as tabelas, mas também deve usar uma interface do usuário.

0
Ethan Post
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;   
0
Abu Turab