Dans Oracle SQL Developer , si je visualise les informations sur une table, je peux voir les contraintes, ce qui me permet de voir les clés étrangères (et donc les tables référencées par cette table), ainsi que la dépendances pour voir quels paquets et tel référence la table. Mais je ne sais pas comment trouver quelles tables font référence à la table.
Par exemple, supposons que je regarde la table emp
. Il existe une autre table emp_dept
qui répertorie les employés qui travaillent dans quels départements, qui référence la table emp
à travers emp_id
, la clé primaire de la table emp
. Existe-t-il un moyen (via un élément d'interface utilisateur du programme, et non via SQL) de trouver que la table emp_dept
fait référence à la table emp
, sans que je sache que la table emp_dept
existe?
Non. Aucune option de ce type n’est disponible chez Oracle SQL Developer.
Vous devez exécuter une requête manuellement ou utiliser un autre outil (Par exemple Le développeur PLSQL a une telle option). Le SQL suivant est celui utilisé par le développeur PLSQL:
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
Où r_owner
est le schéma et r_table_name
est la table pour laquelle vous recherchez des références. Les noms sont sensibles à la casse
Soyez prudent, car dans l'onglet Rapports de Oracle SQL Developer, l'option "Toutes les tables/dépendances" provient de ALL_DEPENDENCIES qui fait référence à "dépendances entre procédures, packages, fonctions, corps de package et déclencheurs accessibles à l'utilisateur actuel, y compris les dépendances sur les vues créées sans aucun lien de base de données. " Ensuite, ce rapport n'a aucune valeur pour votre question.
Pour ajouter cela à SQL Developer en tant qu'extension, procédez comme suit:
<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>
Ajoutez l'extension à SQL Developer:
Accédez à n'importe quelle table et vous devriez maintenant voir un onglet supplémentaire à côté de celui de SQL, intitulé Références FK, qui affiche les nouvelles informations sur le FK.
Référence
Remplacez [Votre TABLE] parempdans la requête ci-dessous
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]');
Vous pourrez peut-être interroger ceci à partir de la vue 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"
);
SQL Developer 4.1, publié en mai 2015, a ajouté un onglet Modèle qui affiche les clés étrangères de table qui font référence à votre table dans un format de diagramme de relation d'entité.
Que diriez-vous quelque chose comme ça:
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';
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;
Pour ajouter à la réponse ci-dessus pour le plug-in de développement SQL, l'utilisation du code XML ci-dessous vous aidera à obtenir la colonne associée à la clé étrangère.
<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>