Oracle SQL Developer'da hangi tabloların belirli bir tabloya başvurduğunu nasıl bulabilirim?


201

In Oracle SQL Developer ben bir tablo bilgi görüntülerken ediyorsam, beni (tablo bu tablo tarafından başvurulan ve dolayısıyla) yabancı anahtarları görelim kısıtlamaları, görüntüleyebilir ve ne görmek bağımlılıkları görüntüleyebilirsiniz paketler ve böyle bir tablo referans. Ancak hangi tabloların tabloya başvurduğunu nasıl bulacağımı bilmiyorum.

Örneğin, empmasaya bakıyorum diyelim . emp_deptHangi çalışanların hangi departmanlarda çalıştığını, emptablonun içinden geçerek tablonun emp_idbirincil anahtarını yakalayan başka bir tablo var emp. Tablonun var olduğunu bilmek zorunda kalmadan emp_dept, emptablonun tabloya başvurduğunu bulmanın bir yolu (programdaki bazı UI öğeleri aracılığıyla) emp_deptvar mı?

Yanıtlar:


260

Hayır. Oracle SQL Developer'da böyle bir seçenek yoktur.

El ile bir sorgu yürütmeniz veya başka bir araç kullanmanız gerekir (Örneğin, PLSQL Developer'ın böyle bir seçeneği vardır). Aşağıdaki SQL, PLSQL Developer tarafından kullanılanıdır:

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Şema nerede ve r_table_namereferans aradığınız tablo. İsimler büyük / küçük harfe duyarlıdır


Oracle SQL Developer Raporlar sekmesinde Bunun nereden "Bağımlılıklar Tüm tablolar /" seçeneği yoktur çünkü dikkatli olun ALL_DEPENDENCIES "anlamına gelir bağımlılıkları dahil geçerli kullanıcı için erişilebilir prosedürler, paketler, fonksiyonlar, paket organları ve tetikleyiciler arasında bağımlılıkları görünümleri herhangi bir veritabanı bağlantısı olmadan oluşturulan. " . Ardından, bu raporun sorunuz için bir değeri yoktur.


30
Cevap için teşekkürler. Emme için Oracle Sql Developer'da yazık.
Greg

1
PLSQL Developer'ın bu işlevi yapabildiğinden bahsettiniz, nasıl olduğunu açıklayabilir misiniz?
Nicholas

4
@Nicholas, Nesne tarayıcısında bir tablo seçin, bir tabloya sağ tıklayın ve "Yabancı Anahtar Referansları"

3
Bu yanıt , SQL Developer 4.1 ve sonraki sürümlerin artık bu bilgileri ERD biçiminde gösterecek bir "Model" sekmesine sahip olduğunu gösterir.
SnoringFrog

1
r_owner kullandığınız şema, r_table_name aradığınız tablolar
Flowy

108

Bunu SQL Developer'a uzantı olarak eklemek için aşağıdakileri yapın:

  1. Aşağıdaki kodu bir xml dosyasına kaydedin (örn. 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. Uzantıyı SQL Developer'a ekleyin:

    • Araçlar> Tercihler
    • Veritabanı> Kullanıcı Tanımlı Uzantılar
    • "Satır Ekle" düğmesini tıklayın
    • Tür "EDITOR" seçin, Konum yukarıdaki xml dosyasını kaydettiğiniz yerdir
    • "Tamam" ı tıklayın ve ardından SQL Geliştiricisini yeniden başlatın
  2. Herhangi bir tabloya gidin ve şimdi yeni bir FK bilgisini görüntüleyen FK References etiketli SQL sekmesinin yanında ek bir sekme görmelisiniz.

  3. Referans


Paketler için düğüm adının ne olduğunu biliyor musunuz? Web'de bulduğum xsd bağlantılarının tümü artık geçerli değil (Oracle'da olduğu gibi onları kaldırdı).
James Sumners

1
Önerilerinize küçük bir değişiklik ekledim: ve siparişten önce owner = user , böylece iki şemada aynı tabloların iki örneğine sahipseniz,
şemanızla

Bu koşulu ekledim: and owner = :OBJECT_OWNERönce and exists.
M Denis

3
@ M-Denis, bu durumda diğer şemalardan referansları kaçırabilirsiniz.
Youw

Bu uygulama ve çalıştırdıktan sonra describe books;ve select * from books;bu Oracle'ın sql geliştirici VM fk referansları sekmesini göstermez.
mLstudent33

36

Aşağıdaki sorgunuzda [Your TABLE] ifadenizi emp ile değiştirin

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

Bence constraint_type in ('P','U') gereksizdir, çünkü bir TOTO kısıtlamasının kısıtlama_tipi 'R' ise, TOTO'nun r_constraint_name'si elbette başvurulan tabloda 'P' VEYA 'U' tipinde bir kısıtlamanın adıdır. Belirtmeye gerek yoktur. Bir kullanıyorsunuz IN, bu bir sürü gibi ORve sadece OR'nin doğru olarak değerlendirilen tek işlenişini önemsiyoruz.
Gab 是 好人

11

Bunu ALL_CONSTRAINTSgörünümden sorgulayabilirsiniz :

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
Yabancı anahtarlar yalnızca birincil anahtarlara değil Benzersiz Anahtarlara da başvurabilir, ayrıca tablo adı birden fazla şemada birden fazla eşleşmeyle sonuçlanabilecek şekilde kullanılabilir. 'User_Constraints' yerine 'All_Constraints' kullanacaksanız 'Sahip' sütununu da kullanmanız gerekir.
Mark Roddy

1
'R' 'U' ve 'P' nin ne olduğunu yorumladığınız için teşekkürler
Jeff

SQL isteğinin sonundaki noktalı virgül unutmayın.
Gab 是 好人

Bu arada, ('P', 'U') içindeki kısıtlama türü gereksizdir, çünkü bir TOTO kısıtlamasının kısıtlama_tipi 'R' ise, TOTO'nun r_constraint_name'si elbette 'P' VEYA 'U tipinde bir kısıtlamanın adıdır. 'ifadesini kullanın. Belirtmeye gerek yoktur.
Gab 是 好人

9

Mayıs 2015'te piyasaya sürülen SQL Developer 4.1, tablonuza bir Varlık İlişki Diyagramı biçiminde başvuran tablo yabancı anahtarlarını gösteren bir Model sekmesi ekledi.


1
Herhangi bir nedenle bir senaryoda buna ihtiyacınız varsa daha az yararlıdır, ancak bağlantılar hakkında bilgi sahibi olmanız gerekiyorsa, bu modern yol gibi görünmektedir.
SnoringFrog

1
@SnoringFrog teknik olarak soru bir UI öğesi istiyor, bu yüzden bu en uygun cevap
WhatsThePoint

4

Böyle bir şeye ne dersin:

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
Ben den tablo adını değiştirdi, bu benim için çalıştı dba_constraintsiçin all_constraints: şöyleSELECT 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; 

Bu son derece kullanışlıdır - bu kök tabloda seçtiğiniz bir sütunun değerini anahtar olarak tutan belirli bir kök tablodaki özyinelemeli tüm tabloları gösterir. Mükemmel, teşekkürler.
Ev0oD

Bu gerçekten harika - iyi iş. Tablo_adı ve sütun_adı karşılaştırmak için sadece lower () eklerdim.
Tobias Otto

4

Bu, 2011'de üründe olmasa da yıllardır üründe.

Ancak, Model sayfasını tıklamanız yeterlidir.

Bu özelliğe erişmek için en az sürüm 4.0 (2013'te piyasaya sürüldü) olduğundan emin olun.

resim açıklamasını buraya girin


0

Sql geliştirici eklentisi için yukarıdaki cevaba eklemek için, aşağıdaki xml kullanmak yabancı anahtarla ilişkili sütunun alınmasına yardımcı olacaktır.

    <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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.