Как я могу найти, какие таблицы ссылаются на данную таблицу в Oracle SQL Developer?
В Oracle SQL Developer, если я просматриваю информацию на таблице, я могу просмотреть ограничения, которые позволяют мне видеть иностранные (и, следовательно, какие таблицы ссылаются на эту таблицу), и я могу просмотреть зависимости, чтобы увидеть, какие пакеты и такая ссылка ссылаются на таблицу. Но я не уверен, как найти таблицы, которые ссылаются на таблицу.
Например, скажем, я смотрю таблицу emp
. Существует еще одна таблица emp_dept
, которая фиксирует, какие сотрудники работают в тех отделах, которые ссылаются на таблицу emp
на emp_id
, на первичный ключ таблицы emp
. Есть ли способ (через некоторый элемент пользовательского интерфейса в программе, а не через SQL) обнаружить, что таблица emp_dept
ссылается на таблицу emp
, не говоря уже о том, что существует таблица emp_dept
?
Ответы
Ответ 1
Нет. В Oracle SQL Developer такой возможности нет.
Вы должны выполнить запрос вручную или использовать другой инструмент (например, PLSQL Developer имеет такую возможность). Следующий SQL - это тот, который используется разработчиком 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
Где r_owner
- это схема, а r_table_name
- таблица, для которой вы ищете ссылки. Имена чувствительны к регистру
Будьте осторожны, потому что на вкладке отчетов Oracle SQL Developer есть опция "Все таблицы/зависимости" от ALL_DEPENDENCIES, которая ссылается на "зависимости между процедурами, пакетами, функциями, телами пакетов и триггерами, доступными для текущего пользователя, включая зависимости от представлений, созданных без ссылок на базы данных". Тогда этот отчет не имеет значения для вашего вопроса.
Ответ 2
Чтобы добавить это в SQL Developer в качестве расширения, выполните следующие действия:
- Сохраните приведенный ниже код в 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>
-
Добавьте расширение в SQL Developer:
- Инструменты > Настройки
- База данных > Пользовательские расширения
- Нажмите кнопку "Добавить строку"
- В "Тип" выберите "РЕДАКТОР", "Местоположение", где вы сохранили файл xml выше
- Нажмите "ОК", затем перезапустите SQL Developer
-
Перейдите к любой таблице, и теперь вы увидите дополнительную вкладку рядом с SQL, помеченную FK References, которая отображает новую информацию FK.
-
Ссылка
Ответ 3
Замените [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]');
Ответ 4
Вы можете запросить это из представления 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"
);
Ответ 5
SQL Developer 4.1, выпущенный в мае 2015 года, добавил вкладку "Модель", в которой отображаются внешние ключи таблицы, которые относятся к вашей таблице в формате диаграммы сущностей.
Ответ 6
Как насчет чего-то вроде этого:
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';
Ответ 7
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;