Як я можу знайти, які таблиці посилаються на дану таблицю в Oracle SQL Developer?


199

У розробнику Oracle SQL , якщо я переглядаю інформацію на таблиці, я можу переглянути обмеження, які дозволяють мені бачити зовнішні ключі (і, таким чином, на які таблиці посилається ця таблиця), і я можу переглянути залежності, щоб побачити, що пакети та таке посилання на таблицю. Але я не впевнений, як знайти, які таблиці посилаються на таблицю.

Наприклад, скажіть, я дивлюся на empстіл. Є ще одна таблиця, emp_deptяка фіксує, які працівники працюють, в яких відділах, через які посилається на empтаблицю emp_id, - первинний ключ empтаблиці. Чи є спосіб (через якийсь елемент інтерфейсу в програмі, а не через SQL) виявити, що emp_deptтаблиця посилається на empтаблицю, не знаючи, що emp_deptтаблиця існує?

Відповіді:


258

Ні. Не існує такої опції у розробника Oracle SQL.

Вам потрібно виконати запит вручну або скористатися іншим інструментом (наприклад, у PLSQL Developer є така опція). Наступний SQL - той, який використовується PLSQL Developer:

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схема і r_table_nameтаблиця, для якої ви шукаєте посилання. Назви залежать від регістру


Будьте уважні, оскільки на вкладці звітів Oracle SQL Developer є опція "Усі таблиці / залежності", це від ALL_DEPENDENCIES, яка посилається на " залежності між процедурами, пакетами, функціями, органами пакетів та тригерами, доступними для поточного користувача, включаючи залежності для представлень, створених без будь-яких посилань на базу даних. " . Тоді цей звіт не має значення для вашого питання.


30
Дякую за відповідь. Ганьба розробнику Oracle Sql за смоктання.
Грег

1
Ви згадали, що розробник PLSQL може виконувати цю функцію, чи можете ви пояснити, як?
Миколай

4
@Nicholas, У браузері об'єктів виберіть таблицю, клацніть правою кнопкою миші на таблиці та виберіть "Посилання іноземного ключа"
FerranB

3
Ця відповідь посилається на те, що SQL Developer 4.1 і новіші тепер мають опцію "Модель", що відображатиме цю інформацію у форматі ERD.
ХропінняFrog

1
r_owner - це схема, яку ви використовуєте, r_table_name - таблиця, на яку ви шукаєте посилання
Flowy

108

Щоб додати це до SQL Developer як розширення, виконайте наступне:

  1. Збережіть наведений нижче код у файлі xml (наприклад, 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. Додайте розширення до SQL Developer:

    • Інструменти> Налаштування
    • База даних> Розширення, визначені користувачем
    • Натисніть кнопку "Додати рядок"
    • У Тип виберіть "EDITOR", Місце розташування - це місце, де ви зберегли xml-файл вище
    • Клацніть «Добре», потім перезапустіть розробник SQL
  2. Перейдіть до будь-якої таблиці, і тепер ви побачите додаткову вкладку поруч із SQL, з написом FK References, що відображає нову інформацію FK.

  3. Довідково


Чи знаєте ви, що назва вузла для пакетів? Усі посилання xsd, які я знаходжу в Інтернеті, більше не дійсні (як в Oracle їх видалено).
Джеймс Самнерс

1
Я додав невелику зміну до вашої пропозиції: і owner = користувач перед замовленням, таким чином, якщо у вас є два екземпляри одних і тих же таблиць у двох схемах, ви отримуєте лише посилання, що стосуються вашої схеми
user1708042

Я додав цю умову: and owner = :OBJECT_OWNERраніше and exists.
М Дені

3
@ M-Denis, в цьому випадку ви можете пропустити посилання з інших схем.
Ти

після застосування цього і працює , describe books;і select * from books;він не показує вкладку Посилання на FK Oracle SQL Developer VM.
mLstudent33

36

Замініть [Ваша таблиця] на 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]');

Я думаю, що constraint_type in ('P','U') це зайве, тому що якщо тип обмеження TOTO обмеження є "R", то r_constraint_name TOTO, звичайно, є ім'ям обмеження типу 'P' АБО 'U' у посиланій таблиці. Не потрібно його вказувати. Ви використовуєте IN, так що це так само, як і багато, ORі ми дбаємо лише про єдиний операнд АБО, який оцінюється як істинний.
Габ 是 好人

10

Ви можете отримати запит на це з 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"
    );

1
Іноземні ключі можуть посилатися на унікальні ключі, а не лише на первинні ключі, також ім'я таблиці може використовуватися в декількох схемах, що призведе до декількох збігів. Вам також потрібно використовувати стовпчик "Власник", якщо ви збираєтесь використовувати "All_Constraints", а не "User_Constraints".
Марк Родді

Дякуємо, що прокоментували, що таке "R" "U" та "P"
Джефф

Не забудьте крапку з комою в кінці запиту SQL.
Габ 是 好人

До речі, constraint_type в ('P', 'U') є зайвим, тому що якщо constraint_type обмеження TOTO є 'R', то r_constraint_name TOTO, звичайно, є ім'ям обмеження типу 'P' АБО 'U 'у посиланій таблиці. Не потрібно його вказувати.
Ґаб 是 好人

9

SQL Developer 4.1, випущений у травні 2015 року, додав вкладку Model, яка показує зовнішні ключі таблиці, які посилаються на вашу таблицю у форматі діаграми відносин особи.


1
Менш корисно, якщо вам це потрібно в сценарії з якихось причин, але якщо вам просто потрібно знати про з'єднання, це здається сучасним шляхом.
ХропінняFrog

1
@SnoringFrog в технічному плані питання задає елемент інтерфейсу, тому це найбільш відповідна відповідь
WhatsThePoint

4

Як щодо щось подібне:

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
Це працювало для мене, коли я змінив назву таблиці dba_constraintsна all_constraintsтак, як: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; 

Це надзвичайно корисно - показує рекурсивно всі таблиці з певної кореневої таблиці, які містять як ключове значення стовпця, який ви вибрали у цій кореневій таблиці. Чудово, дякую.
Ev0oD

Це дійсно круто - хороша робота. Я б додав лише нижчий () для порівняння імені_століки та імені стовпця.
Тобіас Отто

4

Це було в продукті роками, хоча його не було в 2011 році.

Але просто натисніть на сторінку моделі.

Переконайтеся, що ви маєте принаймні версію 4.0 (випущена у 2013 році) для доступу до цієї функції.

введіть тут опис зображення


0

Щоб додати до наведеної відповіді плагін для розробника sql, використання наведеного нижче xml допоможе отримати стовпець, пов’язаний із зовнішнім ключем.

    <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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.