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

199

Dans Oracle SQL Developer , si je consulte les informations sur une table, je peux afficher les contraintes, qui me permettent de voir les clés étrangères (et donc les tables référencées par cette table), et je peux afficher les dépendances pour voir ce que packages et tels référencer le tableau. Mais je ne sais pas comment trouver les tables qui font référence à la table.

Par exemple, disons que je regarde la emptable. Il existe une autre table emp_deptqui capture quels employés travaillent dans quels services, qui fait référence à la emptable emp_id, la clé primaire de la emptable. Existe-t-il un moyen (via un élément d'interface utilisateur du programme, pas via SQL) de trouver que la emp_depttable fait référence à la emptable, sans que je doive savoir que la emp_depttable existe?

Rudd Zwolinski
la source

Réponses:

258

Non. Aucune option de ce type n'est disponible auprès d'Oracle SQL Developer.

Vous devez exécuter une requête à la main ou utiliser un autre outil (par exemple, PLSQL Developer 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

r_ownerest le schéma et r_table_namela table pour laquelle vous recherchez des références. Les noms sont sensibles à la casse


Soyez prudent car dans l'onglet rapports d'Oracle SQL Developer, il y a l'option "Toutes les tables / dépendances" qui vient de ALL_DEPENDENCIES qui fait référence aux " 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.

FerranB
la source
30
Merci d'avoir répondu. Honte à Oracle Sql Developer pour avoir sucé.
Greg
1
Vous avez mentionné que le développeur PLSQL pouvait faire cette fonction, pouvez-vous expliquer comment?
Nicholas
4
@Nicholas, Dans l'explorateur d'objets, sélectionnez une table, faites un clic droit sur une table et sélectionnez "Références de clé étrangère"
FerranB
3
Cette réponse fait référence au fait que SQL Developer 4.1 et versions ultérieures ont désormais une option sur l'onglet "Modèle" qui affichera ces informations au format ERD.
SnoringFrog
1
r_owner est le schéma que vous utilisez, r_table_name est la table que vous recherchez pour les références
Flowy
108

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>
  1. Ajoutez l'extension à SQL Developer:

    • Outils> Préférences
    • Base de données> Extensions définies par l'utilisateur
    • Cliquez sur le bouton "Ajouter une ligne"
    • Dans Type, choisissez "EDITOR", l'emplacement est l'endroit où vous avez enregistré le fichier xml ci-dessus
    • Cliquez sur "Ok" puis redémarrez SQL Developer
  2. Accédez à n'importe quelle table et vous devriez maintenant voir un onglet supplémentaire à côté de SQL, intitulé Références FK, qui affiche les nouvelles informations FK.

  3. Référence

junaling
la source
Savez-vous quel est le nom du nœud pour les packages? Tous les liens xsd que je trouve sur le Web ne sont plus valides (comme dans Oracle les ont supprimés).
James Sumners
1
J'ai ajouté une petite modification à votre suggestion: et propriétaire = utilisateur avant la commande 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
user1708042
J'ai ajouté cette condition: and owner = :OBJECT_OWNERavant and exists.
M Denis
3
@ M-Denis, dans ce cas, vous pourriez manquer des références d'autres schémas.
Youw
après avoir appliqué cela et exécuté describe books;et select * from books;, il n'affiche pas l'onglet de références fk sur la machine virtuelle Oracle sql developer.
mLstudent33
36

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]');
lexu
la source
Je pense que constraint_type in ('P','U') c'est superflu, car si le type_contrainte d'une contrainte TOTO est 'R', alors r_constraint_name 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 spécifier. Vous utilisez un IN, c'est donc comme beaucoup de ORet nous ne nous soucions que du seul opérande de OR qui a la valeur true.
Gab 是 好人
10

Vous pourrez peut-être l'interroger à partir de la ALL_CONSTRAINTSvue:

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
la source
1
Les clés étrangères peuvent référencer des clés uniques, pas seulement des clés primaires.Le nom de la table peut également être utilisé dans plusieurs schémas, ce qui entraînerait plusieurs correspondances. Vous devez également utiliser la colonne "Propriétaire" si vous comptez utiliser "All_Constraints" et non "User_Constraints".
Mark Roddy
Merci d'avoir commenté ce que sont «R», «U» et «P»
Jeff
N'oubliez pas le point-virgule à la fin de la requête SQL.
Gab 是 好人
Soit dit en passant, constraint_type in ('P', 'U') est superflu, car si le constraint_type d'une contrainte TOTO est 'R', alors r_constraint_name de TOTO est bien sûr le nom d'une contrainte de type 'P' OU 'U 'dans le tableau référencé. Il n'est pas nécessaire de le spécifier.
Gab 是 好人
9

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é.

Mark A. Fitzgerald
la source
1
Moins utile si vous en avez besoin dans un script pour une raison quelconque, mais si vous avez juste besoin de connaître les connexions, cela semble être la voie à suivre moderne.
SnoringFrog
1
@SnoringFrog bien techniquement, la question demande un élément d'interface utilisateur, c'est donc la réponse la plus appropriée
WhatsThePoint
4

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';
DCookie
la source
2
Cela a fonctionné pour moi lorsque j'ai changé le nom de la table dba_constraintspour l' all_constraintsaimer ainsi: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
la source
Ceci est extrêmement utile - affiche récursivement toutes les tables d'une certaine table racine, qui contiennent comme clé la valeur d'une colonne que vous sélectionnez dans cette table racine. Superbe, merci.
Ev0oD
C'est vraiment cool - bon travail. J'ajouterais seulement lower () pour comparer nom_table et nom_colonne.
Tobias Otto
4

Cela fait partie du produit depuis des années - même si ce n'était pas le cas en 2011.

Mais, cliquez simplement sur la page Modèle.

Assurez-vous que vous êtes sur au moins la version 4.0 (sortie en 2013) pour accéder à cette fonctionnalité.

entrez la description de l'image ici

thatjeffsmith
la source
0

Pour ajouter à la réponse ci-dessus pour le plugin de développeur SQL, l'utilisation du xml ci-dessous 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>
Srinivasa Raghavan R
la source