Pregunta

Para una tabla determinada 'foo', necesito una consulta para generar un conjunto de tablas que tengan claves externas que apunten a foo.Estoy usando Oracle 10G.

¿Fue útil?

Solución

Esto debería funcionar (o algo parecido):

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

Otros consejos

La siguiente declaración la deben dar los hijos y todos sus descendientes.Lo probé en una base de datos 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

Aquí se explica cómo llevar la consulta de Mike un paso más allá para obtener la nombres de columnas de los nombres de las restricciones:

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

enlace a Documentación en línea de la base de datos Oracle

Quizás quieras explorar el Vistas del diccionario de datos.Tienen los prefijos:

  • Usuario
  • Todo
  • administrador de bases de datos

muestra:

select * from dictionary where table_name like 'ALL%' 

Siguiendo con el ejemplo de Mike, es posible que desees generar scripts para habilitar/deshabilitar las restricciones.Solo modifiqué el 'seleccionar' en la primera fila.

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

Sé que es un poco tarde para responder, pero déjame responder de todos modos. Algunas de las respuestas anteriores son bastante complicadas, por lo que aquí tienes una solución mucho más sencilla.

       `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;   

Descargue la Guía de referencia de Oracle para 10G que explica las tablas del diccionario de datos.

Las respuestas anteriores son buenas, pero consulte las otras tablas que pueden estar relacionadas con restricciones.

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

Finalmente, obtenga una herramienta como Toad o SQL Developer que le permita explorar estas cosas en una interfaz de usuario; necesita aprender a usar las tablas, pero también debe usar una interfaz de usuario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top