Bagaimana saya bisa menemukan tabel mana yang mereferensikan tabel yang diberikan di Oracle SQL Developer?


199

Di Oracle SQL Developer , jika saya melihat informasi di atas sebuah tabel, saya dapat melihat kendala, yang membuat saya melihat kunci asing (dan dengan demikian tabel mana yang dirujuk oleh tabel ini), dan saya bisa melihat dependensi untuk melihat apa paket dan referensi tersebut tabel. Tapi saya tidak yakin bagaimana menemukan tabel mana yang merujuk tabel.

Misalnya, katakan saya sedang melihat ke empmeja. Ada tabel lain emp_deptyang menangkap karyawan mana yang bekerja di departemen mana, yang merujuk emptabel melalui emp_id, kunci utama emptabel. Apakah ada cara (melalui beberapa elemen UI dalam program, bukan melalui SQL) untuk menemukan bahwa emp_depttabel referensi emptabel, tanpa saya harus tahu bahwa emp_depttabel itu ada?

Jawaban:


258

Tidak. Tidak ada opsi seperti itu yang tersedia dari Oracle SQL Developer.

Anda harus menjalankan kueri dengan tangan atau menggunakan alat lain (Misalnya Pengembang PLSQL memiliki opsi seperti itu). SQL berikut adalah yang digunakan oleh Pengembang 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

Di mana r_ownerskema, dan r_table_namemerupakan tabel yang Anda cari referensi. Namanya peka huruf besar-kecil


Hati-hati karena pada tab laporan Oracle SQL Developer ada opsi "Semua tabel / Ketergantungan" ini dari ALL_DEPENDENCIES yang mengacu pada " dependensi antara prosedur, paket, fungsi, badan paket, dan pemicu yang dapat diakses oleh pengguna saat ini, termasuk dependensi pada tampilan yang dibuat tanpa tautan basis data apa pun. " . Kemudian, laporan ini tidak memiliki nilai untuk pertanyaan Anda.


30
Terima kasih atas jawabannya. Malu pada Oracle Sql Developer untuk mengisap.
Greg

1
Anda menyebutkan Pengembang PLSQL dapat melakukan fungsi ini, dapatkah Anda menjelaskan caranya?
Nicholas

4
@Nicholas, Di browser objek, pilih tabel, klik kanan pada tabel dan pilih "Referensi kunci asing"
FerranB

3
Jawaban ini merujuk pada SQL Developer 4.1 dan yang lebih baru memiliki opsi tab "Model" yang akan menampilkan informasi ini dalam format ERD.
SnoringFrog

1
r_owner adalah skema yang Anda gunakan, r_table_name adalah tabel yang Anda cari referensi
Flowy

108

Untuk menambahkan ini ke Pengembang SQL sebagai ekstensi lakukan hal berikut:

  1. Simpan kode di bawah ini ke file xml (mis. 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. Tambahkan ekstensi ke Pengembang SQL:

    • Alat> Preferensi
    • Database> Ekstensi Buatan Pengguna
    • Klik tombol "Tambahkan Baris"
    • Dalam Ketik pilih "EDITOR", Lokasi adalah tempat Anda menyimpan file xml di atas
    • Klik "Ok" lalu restart SQL Developer
  2. Arahkan ke tabel mana saja dan sekarang Anda akan melihat tab tambahan di sebelah SQL satu, berlabel Referensi FK, yang menampilkan informasi FK baru.

  3. Referensi


Apakah Anda tahu apa nama simpul untuk Paket? Semua tautan xsd yang saya temukan di web tidak lagi valid (seperti pada Oracle yang menghapusnya).
James Sumners

1
Saya menambahkan sedikit perubahan pada saran Anda: dan pemilik = pengguna sebelum pesanan oleh, sehingga jika Anda memiliki dua contoh tabel yang sama dalam dua skema, Anda hanya mendapatkan referensi yang relevan dengan skema Anda
user1708042

Saya menambahkan kondisi ini: and owner = :OBJECT_OWNERsebelumnya and exists.
M Denis

3
@ M-Denis, dalam hal ini Anda mungkin kehilangan referensi dari skema lain.
Youw

setelah menerapkan ini dan berjalan describe books;dan select * from books;, itu tidak menunjukkan tab referensi fk pada Oracle sql developer VM.
mLstudent33

36

Ganti [TABEL Anda] dengan emp dalam kueri di bawah ini

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

Saya pikir constraint_type in ('P','U') itu berlebihan, karena jika constraint_type dari TOTO kendala adalah 'R', maka r_constraint_name TOTO tentu saja nama kendala jenis 'P' ATAU 'U' pada tabel yang direferensikan. Tidak perlu menentukannya. Anda menggunakan IN, jadi itu seperti banyak ORdan kami hanya peduli satu-satunya operan OR yang bernilai true.
Gab 是 好人

10

Anda mungkin dapat menanyakan ini dari ALL_CONSTRAINTStampilan:

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
Kunci asing dapat merujuk Kunci Unik, tidak hanya kunci utama, juga, nama tabel dapat digunakan dalam beberapa skema yang akan menghasilkan beberapa pertandingan. Anda perlu menggunakan kolom 'Pemilik' juga jika Anda akan menggunakan 'All_Constraints' dan bukan 'User_Constraints'.
Mark Roddy

Terima kasih telah berkomentar apa itu 'R' 'U' dan 'P'
Jeff

Jangan lupa tanda titik koma di akhir permintaan SQL.
Gab 是 好人

Omong-omong, constraint_type di ('P', 'U') adalah berlebihan, karena jika constraint_type dari TOTO constraint adalah 'R', maka r_constraint_name TOTO tentu saja nama batasan dari tipe 'P' OR 'U 'di tabel referensi. Tidak perlu menentukannya.
Gab 是 好人

9

SQL Developer 4.1, dirilis pada Mei 2015, menambahkan tab Model yang menampilkan kunci asing tabel yang merujuk ke tabel Anda dalam format Diagram Hubungan Entitas.


1
Kurang berguna jika Anda memerlukan ini dalam skrip untuk beberapa alasan, tetapi jika Anda hanya perlu tahu tentang koneksi ini sepertinya cara modern untuk pergi.
SnoringFrog

1
@SnoringFrog baik secara teknis pertanyaannya meminta elemen UI jadi ini adalah jawaban yang paling pas
WhatsThePoint

4

Bagaimana dengan sesuatu yang seperti ini:

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
Ini bekerja untuk saya ketika saya mengubah nama tabel dba_constraintsmenjadi all_constraintsseperti: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; 

Ini sangat berguna - menunjukkan secara rekursif semua tabel dari tabel root tertentu, yang berisi nilai kolom yang Anda pilih dalam tabel root ini. Luar biasa, terima kasih.
Ev0oD

Itu sangat keren - kerja bagus. Saya hanya akan menambahkan lebih rendah () untuk membandingkan table_name dan column_name.
Tobias Otto

4

Ini sudah ada dalam produk selama bertahun-tahun - meskipun tidak ada dalam produk pada tahun 2011.

Tapi, cukup klik pada halaman Model.

Pastikan Anda menggunakan setidaknya versi 4.0 (dirilis pada 2013) untuk mengakses fitur ini.

masukkan deskripsi gambar di sini


0

Untuk menambahkan jawaban di atas untuk plugin pengembang sql, menggunakan xml di bawah ini akan membantu dalam mendapatkan kolom yang terkait dengan kunci asing.

    <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>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.