232 votes

Comment puis-je trouver les tables qui font référence à une table donnée dans Oracle SQL Developer ?

En Développeur Oracle SQL 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 quelles tables sont référencées par cette table), et je peux voir les dépendances pour voir quels paquets et autres font référence à la table. Mais je ne sais pas comment trouver les tables qui font référence à la table.

Par exemple, disons que je regarde la page emp table. Il existe une autre table emp_dept qui saisit quels employés travaillent dans quels départements, qui fait référence aux emp table à travers emp_id la clé primaire de la emp table. Existe-t-il un moyen (par le biais d'un élément de l'interface utilisateur dans le programme, et non par le biais du SQL) de trouver que la table emp_dept Le tableau fait référence à la emp table, sans que je doive savoir que le emp_dept existe ?

294voto

FerranB Points 9532

Non. Cette option n'est pas disponible dans Oracle SQL Developer.

Vous devez exécuter une requête à la main ou utiliser un autre outil (Par exemple Développeur PLSQL a cette option). Le SQL suivant est celui utilisé par 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

r_owner est le schéma, et r_table_name est le tableau pour lequel vous cherchez des références. Les noms sont sensibles à la casse


Attention car dans l'onglet rapports d'Oracle SQL Developer il y a l'option "Toutes les tables / Dépendances" c'est à partir de TOUTES_DÉPENDANCES qui fait référence à " les dépendances entre procédures, paquets, fonctions, corps de paquets et déclencheurs accessibles à l'utilisateur actuel, y compris les dépendances sur les vues créées sans aucun lien avec la base de données." . Alors, ce rapport n'a aucune valeur pour votre question.

39 votes

Merci pour la réponse. Honte à Oracle Sql Developer qui est nul.

1 votes

Vous avez mentionné que PLSQL Developer était capable de réaliser cette fonction, pouvez-vous expliquer comment ?

4 votes

@Nicholas, Dans le navigateur des objets, sélectionnez une table, cliquez avec le bouton droit de la souris sur une table et sélectionnez "Références de clés étrangères".

117voto

junaling Points 321

Pour l'ajouter à SQL Developer en tant qu'extension, procédez comme suit :

  1. Enregistrez le code ci-dessous dans un fichier xml (par exemple, 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>

  2. Ajouter l'extension à SQL Developer :

    • Outils > Préférences
    • Base de données > Extensions définies par l'utilisateur
    • Cliquez sur le bouton "Ajouter une rangée".
    • Dans Type, choisissez "EDITOR", Emplacement est l'endroit où vous avez enregistré le fichier xml ci-dessus.
    • Cliquez sur "Ok" puis redémarrez SQL Developer
  3. Naviguez vers 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 FK.

  4. Référence

0 votes

Savez-vous quel est le nom du nœud pour les paquets ? Tous les liens xsd que je trouve sur le Web ne sont plus valides (Oracle les a supprimés).

1 votes

J'ai ajouté une petite modification à votre suggestion : et propriétaire = utilisateur avant l'ordre par, de sorte que si vous avez deux instances des mêmes tables dans deux schémas, vous n'obtenez que les références pertinentes pour votre schéma.

0 votes

J'ai ajouté cette condition : and owner = :OBJECT_OWNER avant and exists .

37voto

lexu Points 5385

Remplacez [votre TABLE] par emp dans 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]');

0 votes

Je pense constraint_type in ('P','U') est superflu, car si le type de contrainte d'une contrainte TOTO est 'R', alors le nom de contrainte r de TOTO est bien sûr le nom d'une contrainte de type 'P' OU 'U' dans la table référencée. Il n'est pas nécessaire de le préciser. Vous utilisez un IN donc c'est comme beaucoup de OR et on ne s'intéresse qu'à la seule opérande de OR qui vaut vrai.

14voto

Adam Paynter Points 22056

Il est possible d'effectuer une requête à partir de la page d'accueil du site. ALL_CONSTRAINTS vue :

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

1 votes

Les clés étrangères peuvent faire référence à des clés uniques, et pas seulement à des clés primaires. En outre, le nom de la table pourrait être utilisé dans plusieurs schémas, ce qui entraînerait plusieurs correspondances. Vous devez également utiliser la colonne "Owner" si vous souhaitez utiliser "All_Constraints" et non "User_Constraints".

1 votes

Merci de commenter ce que sont 'R', 'U' et 'P'.

0 votes

N'oubliez pas le point-virgule à la fin de la requête SQL.

4voto

DCookie Points 22921

Que diriez-vous de 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';

2 votes

Cela a fonctionné pour moi lorsque j'ai changé le nom de la table de dba_constraints à all_constraints comme ça : 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';

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X