Как узнать, какие таблицы ссылаются на данную таблицу в Oracle SQL Developer?


199

В Oracle SQL Developer , если я просматриваю информацию в таблице, я могу просматривать ограничения, которые позволяют мне видеть внешние ключи (и, таким образом, на какие таблицы ссылается эта таблица), и я могу просматривать зависимости, чтобы увидеть, что пакеты и такие ссылки в таблице. Но я не уверен, как найти, какие таблицы ссылаются на таблицу.

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

Ответы:


258

Нет. Такой опции нет в Oracle SQL Developer.

Вы должны выполнить запрос вручную или использовать другой инструмент (например, 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 Developer для сосания.
Грег

1
Вы упомянули, что PLSQL Developer может выполнять эту функцию. Вы можете объяснить, как?
Николас

4
@Nicholas, в браузере объектов выберите таблицу, щелкните правой кнопкой мыши таблицу и выберите «Ссылки на
внешний

3
Этот ответ указывает на то, что в SQL Developer 4.1 и выше теперь есть опция на вкладке «Модель», которая отображает эту информацию в формате ERD.
SnoringFrog

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:

    • Инструменты> Настройки
    • База данных> Пользовательские расширения
    • Нажмите кнопку «Добавить строку»
    • В поле «Тип» выберите «РЕДАКТОР», «Место» - это то место, где вы сохранили файл XML выше.
    • Нажмите «ОК» и перезапустите SQL Developer.
  2. Перейдите к любой таблице, и теперь вы должны увидеть дополнительную вкладку рядом с SQL, помеченную FK References, которая отображает новую информацию FK.

  3. Ссылка


Вы знаете, как называется узел для пакетов? Все ссылки на xsd, которые я нахожу в Интернете, больше не действительны (как в Oracle их удалили).
Джеймс Самнерс

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

Я добавил это условие: and owner = :OBJECT_OWNERраньше and exists.
М Дениса

3
@ M-Denis, в этом случае вы можете пропустить ссылки из других схем.
You

после применения и запуска describe books;и select * from books;, он не показывает вкладку fk reference на Oracle sql developer VM.
mLstudent33

36

Замените [Your TABLE] на 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и мы заботимся только об единственном операнде OR, который оценивается как true.
Габ 是 好人

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.
Габ 是 好人

Между прочим, тип limint_type в ('P', 'U') является излишним, потому что, если тип_ограничения для ограничения TOTO равен 'R', тогда r_constraint_name в TOTO, конечно же, является именем ограничения типа 'P' ИЛИ ​​'U 'в ссылочной таблице. Нет необходимости указывать это.
Габ 是 好人

9

В SQL Developer 4.1, выпущенный в мае 2015 года, добавлена ​​вкладка «Модель», которая отображает внешние ключи таблицы, которые ссылаются на вашу таблицу, в формате диаграммы отношений сущностей.


1
Менее полезно, если вам нужно это по какой-то причине в сценарии, но если вам просто нужно знать о связях, это похоже на современный путь.
SnoringFrog

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

Это действительно круто - хорошая работа. Я бы только добавил lower () для сравнения table_name и column_name.
Тобиас Отто

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.