sql - una - ver relacion entre tablas oracle
¿Cómo puedo encontrar qué tablas hacen referencia a una tabla determinada en Oracle SQL Developer? (7)
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 las tablas a las que hace referencia esta tabla), y puedo ver las dependencias para ver qué paquetes y tal referencia la tabla. Pero no estoy seguro de cómo encontrar qué tablas hacen referencia a la tabla.
Por ejemplo, digamos que estoy mirando la tabla emp
. Hay otra tabla emp_dept
que captura qué empleados trabajan en qué departamentos, que hace referencia a la tabla emp
través de emp_id
, la clave principal de la tabla emp
. ¿Hay alguna manera (a través de algún elemento de UI en el programa, no mediante SQL) de encontrar que la tabla emp_dept
referencia a la tabla emp
, sin que yo tenga que saber que existe la tabla emp_dept
?
No. No existe tal opción disponible de Oracle SQL Developer.
Tienes que ejecutar una consulta a mano o usar otra herramienta (por ejemplo, PLSQL Developer tiene esa opción). El siguiente SQL es el usado 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
Donde r_owner
es el esquema, y r_table_name
es la tabla para la que busca referencias. Los nombres son sensibles a las mayúsculas
Tenga cuidado porque en la pestaña de informes de Oracle SQL Developer existe la opción "Todas las tablas / Dependencias" de ALL_DEPENDENCIES que hace referencia a " dependencias entre procedimientos, paquetes, funciones, cuerpos de paquetes y desencadenadores accesibles para el usuario actual, incluidas las dependencias en vistas creadas sin ningún enlace de base de datos. " . Entonces, este informe no tiene ningún valor para su pregunta.
Para agregar esto a SQL Developer como una extensión, haga lo siguiente:
- 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>
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", Ubicación donde guardó el archivo xml anterior.
- Haga clic en "Ok" y luego reinicie SQL Developer
Navegue a cualquier tabla y ahora debería ver una pestaña adicional al lado de SQL uno, etiquetada Referencias FK, que muestra la nueva información FK.
Referencia
Puede consultar esto desde la vista ALL_CONSTRAINTS
:
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"
);
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'';
Reemplace [Su TABLA] con emp en la siguiente consulta
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]'');
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.
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;