Come posso trovare quali tabelle fanno riferimento a una determinata tabella in Oracle SQL Developer?


199

In Oracle SQL Developer , se sto visualizzando le informazioni su una tabella, posso visualizzare i vincoli, che mi permettono di vedere le chiavi esterne (e quindi quali tabelle sono referenziate da questa tabella) e posso vedere le dipendenze per vedere cosa pacchetti e tale riferimento alla tabella. Ma non sono sicuro di come trovare quali tabelle fanno riferimento alla tabella.

Ad esempio, supponiamo che io stia guardando il emptavolo. C'è un'altra tabella emp_deptche cattura quali impiegati lavorano in quali dipartimenti, che fa riferimento alla emptabella attraverso emp_id, la chiave primaria della emptabella. C'è un modo (attraverso alcuni elementi dell'interfaccia utente nel programma, non tramite SQL) per scoprire che la emp_depttabella fa riferimento alla emptabella, senza che io debba sapere che la emp_depttabella esiste?

Risposte:


258

No. Non esiste tale opzione disponibile da Oracle SQL Developer.

È necessario eseguire una query manualmente o utilizzare altri strumenti (ad esempio, lo sviluppatore PLSQL ha tale opzione). Il seguente SQL è quello utilizzato dallo sviluppatore 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

Dov'è r_ownerlo schema ed r_table_nameè la tabella per cui stai cercando riferimenti. I nomi fanno distinzione tra maiuscole e minuscole


Fai attenzione perché nella scheda dei rapporti di Oracle SQL Developer è presente l'opzione "Tutte le tabelle / dipendenze" che proviene da ALL_DEPENDENCIES che fa riferimento a " dipendenze tra procedure, pacchetti, funzioni, corpi dei pacchetti e trigger accessibili all'utente corrente, comprese le dipendenze su viste create senza collegamenti al database. " . Quindi, questo rapporto non ha alcun valore per la tua domanda.


30
Grazie per la risposta. Peccato per Oracle Sql Developer per succhiare.
Greg

1
Hai menzionato lo sviluppatore PLSQL che è in grado di svolgere questa funzione, puoi spiegare come?
Nicholas

4
@Nicholas, nel browser degli oggetti, selezionare una tabella, fare clic con il tasto destro del mouse su una tabella e selezionare "Riferimenti chiave esterna"
FerranB

3
Questa risposta fa riferimento al fatto che SQL Developer 4.1 e versioni successive hanno un'opzione nella scheda "Modello" che mostrerà queste informazioni in formato ERD.
SnoringFrog

1
r_owner è lo schema che stai utilizzando, r_table_name è la tabella alla quale stai cercando riferimenti
Flowy,

108

Per aggiungere questo a SQL Developer come estensione, procedi come segue:

  1. Salvare il codice seguente in un file xml (ad esempio 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. Aggiungi l'estensione a SQL Developer:

    • Strumenti> Preferenze
    • Database> Estensioni definite dall'utente
    • Fai clic sul pulsante "Aggiungi riga"
    • In Tipo scegli "EDITOR", Posizione è dove hai salvato il file XML sopra
    • Fai clic su "OK", quindi riavvia SQL Developer
  2. Passa a qualsiasi tabella e ora dovresti vedere una scheda aggiuntiva accanto a quella SQL, etichettata Riferimenti FK, che mostra le nuove informazioni FK.

  3. Riferimento


Sai qual è il nome del nodo per i pacchetti? Tutti i collegamenti xsd che trovo sul Web non sono più validi (come in Oracle li hanno rimossi).
James Sumners,

1
Ho aggiunto una piccola modifica al tuo suggerimento: e proprietario = utente prima dell'ordine, in modo tale che se hai due istanze delle stesse tabelle in due schemi ottieni solo i riferimenti pertinenti al tuo schema
user1708042

Ho aggiunto questa condizione: and owner = :OBJECT_OWNERprima and exists.
M Denis

3
@ M-Denis, in questo caso potresti perdere riferimenti ad altri schemi.
Youw

dopo averlo applicato ed eseguito describe books;e select * from books;, non mostra la scheda riferimenti fk sulla VM sviluppatore Oracle sql.
mLstudent33,

36

Sostituisci [Your TABLE] con emp nella query qui sotto

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

Penso che constraint_type in ('P','U') sia superfluo, perché se il tipo di vincolo di un vincolo TOTO è 'R', allora r_constraint_name di TOTO è ovviamente il nome di un vincolo di tipo 'P' OR 'U' nella tabella di riferimento. Non è necessario specificarlo. Stai usando un IN, quindi è proprio come molti ORe ci preoccupiamo solo dell'unico operando di OR che restituisce true.
Gab 是 好人

10

Potresti essere in grado di interrogarlo dalla ALL_CONSTRAINTSvista:

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
Le chiavi esterne possono fare riferimento a chiavi univoche, non solo a chiavi primarie, inoltre, il nome della tabella potrebbe essere utilizzato in più schemi che comporterebbero più corrispondenze. È necessario utilizzare anche la colonna "Proprietario" se si intende utilizzare "Vincoli_all_invio" e non "Vincoli_utente".
Mark Roddy,

Grazie per aver commentato cosa sono 'R' 'U' e 'P'
Jeff

Non dimenticare il punto e virgola alla fine della richiesta SQL.
Gab 是 好人

A proposito, il tipo di vincolo in ('P', 'U') è superfluo, perché se il tipo di vincolo di un vincolo TOTO è 'R', allora r_constraint_name di TOTO è ovviamente il nome di un vincolo di tipo 'P' OR 'U "nella tabella di riferimento. Non è necessario specificarlo.
Gab 是 好人

9

SQL Developer 4.1, rilasciato a maggio 2015, ha aggiunto una scheda Modello che mostra le chiavi esterne della tabella che fanno riferimento alla tabella in un formato Diagramma di entità.


1
Meno utile se hai bisogno di questo in uno script per qualche motivo, ma se hai solo bisogno di conoscere le connessioni, questo sembra il modo moderno di procedere.
SnoringFrog

1
@SnoringFrog tecnicamente la domanda richiede un elemento dell'interfaccia utente, quindi questa è la risposta più adatta
WhatsThePoint,

4

Che ne dici di qualcosa del genere:

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
Questo ha funzionato per me, quando ho cambiato il nome della tabella da dba_constraintsa all_constraintsquesto modo: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; 

Ciò è estremamente utile: mostra in modo ricorsivo tutte le tabelle di una determinata tabella radice, che contengono come chiave il valore di una colonna selezionata in questa tabella radice. Superbo, grazie.
Ev0oD

È davvero fantastico - buon lavoro. Aggiungerei solo lower () per confrontare table_name e column_name.
Tobias Otto,

4

Questo è stato nel prodotto per anni - anche se non era nel prodotto nel 2011.

Ma, fai semplicemente clic sulla pagina Modello.

Assicurati di avere almeno la versione 4.0 (rilasciata nel 2013) per accedere a questa funzione.

inserisci qui la descrizione dell'immagine


0

Per aggiungere la risposta sopra per il plug-in per sviluppatori sql, l'uso dell'xml seguente aiuterà a ottenere la colonna associata alla chiave esterna.

    <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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.