Wie kann ich herausfinden, welche Tabellen in Oracle SQL Developer auf eine bestimmte Tabelle verweisen?


199

Wenn ich in Oracle SQL Developer die Informationen in einer Tabelle ansehe, kann ich die Einschränkungen anzeigen, mit denen ich die Fremdschlüssel sehen kann (und somit welche Tabellen in dieser Tabelle referenziert werden), und ich kann die Abhängigkeiten anzeigen, um zu sehen, was Pakete und solche verweisen auf die Tabelle. Ich bin mir jedoch nicht sicher, wie ich herausfinden soll, welche Tabellen auf die Tabelle verweisen.

Angenommen, ich schaue auf den empTisch. Es gibt eine weitere Tabelle, in emp_deptder erfasst wird, welche Mitarbeiter in welchen Abteilungen arbeiten, die auf die empTabelle verweist emp_id, den Primärschlüssel der empTabelle. Gibt es eine Möglichkeit (über ein UI-Element im Programm, nicht über SQL) festzustellen, dass die emp_deptTabelle auf die empTabelle verweist , ohne dass ich wissen muss, dass die emp_deptTabelle vorhanden ist?

Antworten:


258

Nein. Oracle SQL Developer bietet keine solche Option an.

Sie müssen eine Abfrage von Hand ausführen oder ein anderes Tool verwenden (zum Beispiel hat PLSQL Developer eine solche Option). Das folgende SQL wird von PLSQL Developer verwendet:

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

Wo r_ownerist das Schema und r_table_nameist die Tabelle, für die Sie nach Referenzen suchen. Die Namen unterscheiden zwischen Groß- und Kleinschreibung


Seien Sie vorsichtig, da auf der Registerkarte "Berichte" von Oracle SQL Developer die Option "Alle Tabellen / Abhängigkeiten" von ALL_DEPENDENCIES angezeigt wird, die sich auf " Abhängigkeiten zwischen Prozeduren, Paketen, Funktionen, Paketkörpern und Triggern bezieht, auf die der aktuelle Benutzer zugreifen kann , einschließlich Abhängigkeiten auf Ansichten, die ohne Datenbankverknüpfungen erstellt wurden. " . Dann hat dieser Bericht keinen Wert für Ihre Frage.


30
Danke für die Antwort. Schade um Oracle Sql Developer fürs Saugen.
Greg

1
Sie haben erwähnt, dass PLSQL Developer diese Funktion ausführen kann. Können Sie erklären, wie?
Nicholas

4
@Nicholas, Wählen Sie im Objektbrowser eine Tabelle aus, klicken Sie mit der rechten Maustaste auf eine Tabelle und wählen Sie "Fremdschlüsselreferenzen"
FerranB

3
Diese Antwort verweist darauf, dass SQL Developer 4.1 und höher jetzt eine Option auf der Registerkarte "Modell" haben, auf der diese Informationen im ERD-Format angezeigt werden.
Schnarchen Frosch

1
r_owner ist das Schema, das Sie verwenden, r_table_name ist eine Tabelle, nach der Sie suchen
Flowy

108

Gehen Sie wie folgt vor, um dies als Erweiterung zu SQL Developer hinzuzufügen:

  1. Speichern Sie den folgenden Code in einer XML-Datei (z. B. 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. Fügen Sie die Erweiterung zu SQL Developer hinzu:

    • Extras> Einstellungen
    • Datenbank> Benutzerdefinierte Erweiterungen
    • Klicken Sie auf die Schaltfläche "Zeile hinzufügen"
    • Wählen Sie unter Typ die Option "BEARBEITER". Unter Speicherort haben Sie die XML-Datei oben gespeichert
    • Klicken Sie auf "OK" und starten Sie SQL Developer neu
  2. Wenn Sie zu einer beliebigen Tabelle navigieren, sollte neben SQL eine zusätzliche Registerkarte mit der Bezeichnung FK-Referenzen angezeigt werden, auf der die neuen FK-Informationen angezeigt werden.

  3. Referenz


Wissen Sie, wie der Knotenname für Pakete lautet? Alle xsd-Links, die ich im Web finde, sind nicht mehr gültig (wie in Oracle entfernt).
James Sumners

1
Ich habe Ihrem Vorschlag eine kleine Änderung hinzugefügt: und owner = user vor der Bestellung von, sodass Sie, wenn Sie zwei Instanzen derselben Tabellen in zwei Schemas haben, nur die für Ihr Schema relevanten Referenzen erhalten
user1708042

Ich habe diese Bedingung hinzugefügt: and owner = :OBJECT_OWNERvorher and exists.
M Denis

3
@ M-Denis, in diesem Fall könnten Sie Referenzen aus anderen Schemata verpassen.
Youw

Nach dem Anwenden und Ausführen von describe books;und select * from books;wird die Registerkarte fk-Referenzen auf der Oracle SQL-Entwickler-VM nicht angezeigt.
mLstudent33

36

Ersetzen Sie [Ihre TABELLE] in der folgenden Abfrage durch emp

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

Ich halte constraint_type in ('P','U') das für überflüssig, denn wenn der Einschränkungstyp einer Einschränkung TOTO 'R' ist, ist der r_constraint_name von TOTO natürlich der Name einer Einschränkung vom Typ 'P' ODER 'U' in der referenzierten Tabelle. Es ist nicht erforderlich, dies anzugeben. Sie verwenden ein IN, es ist also wie bei vielen anderen ORund wir kümmern uns nur um den einzigen Operanden von OR, der als wahr ausgewertet wird.
Gab

10

Möglicherweise können Sie dies in der ALL_CONSTRAINTSAnsicht abfragen :

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
Fremdschlüssel können auf eindeutige Schlüssel verweisen, nicht nur auf Primärschlüssel. Der Tabellenname kann auch in mehreren Schemas verwendet werden, was zu mehreren Übereinstimmungen führen würde. Sie müssen auch die Spalte "Eigentümer" verwenden, wenn Sie "All_Constraints" und nicht "User_Constraints" verwenden möchten.
Mark Roddy

Vielen Dank für den Kommentar, was 'R' 'U' und 'P' sind
Jeff

Vergessen Sie nicht das Semikolon am Ende der SQL-Anforderung.
Gab

Übrigens ist der Einschränkungstyp in ('P', 'U') überflüssig, denn wenn der Einschränkungstyp einer Einschränkung TOTO 'R' ist, ist der r_constraint_name von TOTO natürlich der Name einer Einschränkung vom Typ 'P' ODER 'U. 'in der Tabelle, auf die verwiesen wird. Es ist nicht erforderlich, dies anzugeben.
Gab

9

SQL Developer 4.1, das im Mai 2015 veröffentlicht wurde, hat eine Registerkarte Modell hinzugefügt, auf der Tabellenfremdschlüssel angezeigt werden, die in einem Entity Relationship Diagram-Format auf Ihre Tabelle verweisen.


1
Weniger nützlich, wenn Sie dies aus irgendeinem Grund in einem Skript benötigen, aber wenn Sie nur die Zusammenhänge kennen müssen, scheint dies der moderne Weg zu sein.
Schnarchen Frosch

1
@ SnoringFrog gut technisch die Frage fragt nach einem UI-Element, so dass dies die
passendste

4

Wie wäre es mit so etwas:

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
Das ist für mich gearbeitet , wenn ich die Tabellennamen von geändert dba_constraintszu all_constraintsetwa so: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; 

Dies ist äußerst nützlich - zeigt rekursiv alle Tabellen aus einer bestimmten Stammtabelle an, die als Schlüssel einen Wert einer Spalte enthalten, die Sie in dieser Stammtabelle auswählen. Super, danke.
Ev0oD

Das ist echt cool - gute Arbeit. Ich würde nur lower () hinzufügen, um Tabellenname und Spaltenname zu vergleichen.
Tobias Otto

4

Dies ist seit Jahren im Produkt enthalten - obwohl es 2011 nicht im Produkt enthalten war.

Klicken Sie einfach auf die Seite Modell.

Stellen Sie sicher, dass Sie mindestens Version 4.0 (veröffentlicht 2013) verwenden, um auf diese Funktion zugreifen zu können.

Geben Sie hier die Bildbeschreibung ein


0

Um die obige Antwort für das SQL-Entwickler-Plugin zu ergänzen, hilft die Verwendung der folgenden XML-Datei dabei, die dem Fremdschlüssel zugeordnete Spalte zu ermitteln.

    <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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.