web-dev-qa-db-fra.com

Comment trouver les tables qui référencent une table donnée dans Oracle SQL Developer?

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?

168
Rudd Zwolinski

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

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.

222
FerranB

Pour ajouter cela à 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'emplacement 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 celui de SQL, intitulé Références FK, qui affiche les nouvelles informations sur le FK.

  3. Référence

100
junaling

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]');
33
lexu

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"
    );
8
Adam Paynter

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

7
Mark A. Fitzgerald

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';
4
DCookie
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; 
3
Abu Turab

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 d'avoir au moins la version 4.0 (publiée en 2013) pour accéder à cette fonctionnalité.

 enter image description here

1
thatjeffsmith

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>
0