¿Cómo puedo encontrar qué tablas hacen referencia a una tabla dada en Oracle SQL Developer?

199

En Oracle SQL Developer , si estoy viendo la información en una tabla, puedo ver las restricciones, lo que me permite ver las claves externas (y, por lo tanto, a qué tablas hace referencia esta tabla), y puedo ver las dependencias para ver qué paquetes y tal referencia a la tabla. Pero no estoy seguro de cómo encontrar qué tablas hacen referencia a la tabla.

Por ejemplo, digamos que estoy mirando la empmesa. Hay otra tabla emp_deptque captura qué empleados trabajan en qué departamentos, que hace referencia a la emptabla emp_id, la clave principal de la emptabla. ¿Hay alguna manera (a través de algún elemento de la interfaz de usuario en el programa, no a través de SQL) para encontrar que la emp_depttabla hace referencia a la emptabla, sin que tenga que saber que la emp_depttabla existe?

Rudd Zwolinski
fuente

Respuestas:

258

No. No hay tal opción disponible de Oracle SQL Developer.

Debe ejecutar una consulta a mano o utilizar otra herramienta (por ejemplo, PLSQL Developer tiene esa opción). El siguiente SQL es el utilizado por PLSQL Developer:

select table_name, constraint_name, status, owner
from all_constraints
where r_owner = :r_owner
and constraint_type = 'R'
and r_constraint_name in
 (
   select constraint_name from all_constraints
   where constraint_type in ('P', 'U')
   and table_name = :r_table_name
   and owner = :r_owner
 )
order by table_name, constraint_name

Dónde r_ownerestá el esquema y r_table_namees la tabla para la que está buscando referencias. Los nombres distinguen entre mayúsculas y minúsculas


Tenga cuidado porque en la pestaña de informes de Oracle SQL Developer existe la opción "Todas las tablas / dependencias", esto es de ALL_DEPENDENCIES que se refiere a " dependencias entre procedimientos, paquetes, funciones, cuerpos de paquetes y disparadores accesibles para el usuario actual, incluidas las dependencias en vistas creadas sin ningún enlace de base de datos ". . Entonces, este informe no tiene valor para su pregunta.

FerranB
fuente
30
Gracias por la respuesta. Vergüenza en Oracle Sql Developer por chupar.
Greg
1
Usted mencionó que PLSQL Developer puede hacer esta función, ¿puede explicar cómo?
Nicholas
44
@Nicholas, en el navegador de objetos, seleccione una tabla, haga clic con el botón derecho en una tabla y seleccione "Referencias de clave externa"
FerranB
3
Esta respuesta hace referencia a que SQL Developer 4.1 y versiones posteriores ahora tienen una opción en la pestaña "Modelo" que mostrará esta información en formato ERD.
SnoringFrog
1
r_owner es el esquema que está utilizando, r_table_name es la tabla que está buscando referencias
Flowy
108

Para agregar esto a SQL Developer como una extensión, haga lo siguiente:

  1. Guarde el siguiente código en un archivo xml (por ejemplo, fk_ref.xml):
<items>
    <item type="editor" node="TableNode" vertical="true">
    <title><![CDATA[FK References]]></title>
    <query>
        <sql>
            <![CDATA[select a.owner,
                            a.table_name,
                            a.constraint_name,
                            a.status
                     from   all_constraints a
                     where  a.constraint_type = 'R'
                            and exists(
                               select 1
                               from   all_constraints
                               where  constraint_name=a.r_constraint_name
                                      and constraint_type in ('P', 'U')
                                      and table_name = :OBJECT_NAME
                                      and owner = :OBJECT_OWNER)
                               order by table_name, constraint_name]]>
        </sql>
    </query>
    </item>
</items>
  1. Agregue la extensión a SQL Developer:

    • Herramientas> Preferencias
    • Base de datos> Extensiones definidas por el usuario
    • Haga clic en el botón "Agregar fila"
    • En Tipo, elija "EDITOR", la ubicación es donde guardó el archivo xml anterior
    • Haga clic en "Aceptar" y luego reinicie SQL Developer
  2. Navegue a cualquier tabla y ahora debería ver una pestaña adicional junto a SQL one, etiquetada Referencias FK, que muestra la nueva información FK.

  3. Referencia

junking
fuente
¿Sabes cuál es el nombre del nodo para los paquetes? Todos los enlaces xsd que encuentro en la web ya no son válidos (como en Oracle los eliminó).
James Sumners
1
Agregué un pequeño cambio a su sugerencia: y propietario = usuario antes del pedido, de modo que si tiene dos instancias de las mismas tablas en dos esquemas, solo obtiene las referencias relevantes para su esquema
usuario1708042
Agregué esta condición: and owner = :OBJECT_OWNERantes and exists.
M Denis
3
@ M-Denis, en este caso, puede perder referencias de otros esquemas.
Youw
después de aplicar esto y ejecutar describe books;y select * from books;, no muestra la pestaña de referencias fk en Oracle sql developer VM.
mLstudent33
36

Reemplace [Su TABLA] con emp en la consulta a continuación

select owner,constraint_name,constraint_type,table_name,r_owner,r_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]');
Lexu
fuente
Creo que constraint_type in ('P','U') es superfluo, porque si la restricción_tipo de una restricción TOTO es 'R', entonces r_constraint_name de TOTO es, por supuesto, el nombre de una restricción de tipo 'P' O 'U' en la tabla de referencia. No hay necesidad de especificarlo. Está utilizando un IN, por lo que es como muchos ORy solo nos importa el único operando de OR que se evalúa como verdadero.
Gab 是 好人
10

Puede consultar esto desde la ALL_CONSTRAINTSvista:

SELECT table_name
FROM ALL_CONSTRAINTS
WHERE constraint_type = 'R' -- "Referential integrity"
  AND r_constraint_name IN
    ( SELECT constraint_name
      FROM ALL_CONSTRAINTS
      WHERE table_name = 'EMP'
        AND constraint_type IN ('U', 'P') -- "Unique" or "Primary key"
    );
Adam Paynter
fuente
1
Las claves foráneas pueden hacer referencia a claves únicas, no solo a las claves primarias, también, el nombre de la tabla podría usarse en múltiples esquemas que darían como resultado múltiples coincidencias. También debe usar la columna 'Propietario' si va a usar 'All_Constraints' y no 'User_Constraints'.
Mark Roddy
Gracias por comentar qué son 'R' 'U' y 'P'
Jeff
No olvide el punto y coma al final de la solicitud SQL.
Gab 是 好人
Por cierto, restricción_tipo en ('P', 'U') es superfluo, porque si la restricción_tipo de una restricción TOTO es 'R', entonces r_constraint_name de TOTO es, por supuesto, el nombre de una restricción de tipo 'P' O 'U 'en la tabla referenciada. No hay necesidad de especificarlo.
Gab 是 好人
9

SQL Developer 4.1, lanzado en mayo de 2015, agregó una pestaña Modelo que muestra las claves externas de la tabla que hacen referencia a su tabla en un formato de Diagrama de relación de entidad.

Mark A. Fitzgerald
fuente
1
Menos útil si necesita esto en un script por alguna razón, pero si solo necesita saber sobre las conexiones, esta parece ser la forma moderna de hacerlo.
SnoringFrog
1
@SnoringFrog bien técnicamente, la pregunta pide un elemento de interfaz de usuario, por lo que esta es la respuesta más adecuada
WhatsThePoint
4

Qué tal algo como esto:

SELECT c.constraint_name, c.constraint_type, c2.constraint_name, c2.constraint_type, c2.table_name
  FROM dba_constraints c JOIN dba_constraints c2 ON (c.r_constraint_name = c2.constraint_name)
 WHERE c.table_name = <TABLE_OF_INTEREST>
   AND c.constraint_TYPE = 'R';
DCookie
fuente
2
Esto funcionó para mí cuando he cambiado el nombre de la tabla a partir dba_constraintsde all_constraintseste modo:SELECT c.constraint_name, c.constraint_type, c2.constraint_name, c2.constraint_type, c2.table_name FROM all_constraints c JOIN all_constraints c2 ON (c.r_constraint_name = c2.constraint_name) WHERE c.table_name = '<TABLE_OF_INTEREST>' AND c.constraint_TYPE = 'R';
chrisjleu
4
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; 
Abu Turab
fuente
Esto es extremadamente útil: muestra recursivamente todas las tablas de una determinada tabla raíz, que contienen como clave el valor de una columna que seleccione en esta tabla raíz. Excelente, gracias.
Ev0oD
Eso es realmente genial, buen trabajo. Solo agregaría lower () para comparar table_name y column_name.
Tobias Otto
4

Esto ha estado en el producto durante años, aunque no estaba en el producto en 2011.

Pero, simplemente haga clic en la página Modelo.

Asegúrese de tener al menos la versión 4.0 (lanzada en 2013) para acceder a esta función.

ingrese la descripción de la imagen aquí

thatjeffsmith
fuente
0

Para agregar a la respuesta anterior para el complemento de desarrollador sql, usar el siguiente xml ayudará a obtener la columna asociada con la clave externa.

    <items>
        <item type="editor" node="TableNode" vertical="true">
        <title><![CDATA[FK References]]></title>
        <query>
            <sql>
                <![CDATA[select a.owner,
                                a.constraint_name,
                                a.table_name,
                                b.column_name,
                                a.status
                         from   all_constraints a
                         join   all_cons_columns b ON b.constraint_name = a.constraint_name
                         where  a.constraint_type = 'R'
                                and exists(
                                   select 1
                                   from   all_constraints
                                   where  constraint_name=a.r_constraint_name
                                          and constraint_type in ('P', 'U')
                                          and table_name = :OBJECT_NAME
                                          and owner = :OBJECT_OWNER)
                                   order by table_name, constraint_name]]>
            </sql>
        </query>
        </item>
    </items>
Srinivasa Raghavan R
fuente