2010-09-16 2 views
3

Есть ли запрос, который я могу сделать, чтобы найти, какие таблицы имеют внешние ключи в данной таблице? Наш DBA не верит (или понимает?) «ON DELETE CASCADE», поэтому я, когда я удаляю что-то из таблицы, хочу, чтобы я сначала удалил все зависимые вещи.Как узнать, какие таблицы имеют внешние ключи на моем столе?

(Обратите внимание, мне не нужно, чтобы найти таблицы программно, я могу сделать это в SQL * Plus.)

+0

Это хороший ХОРОШИЙ DBA! –

+1

Звучит больше «не верю». ON DELETE CASCADE делает то же самое, что и поиск ограничений и удаление справочных записей. – Christian13467

+0

Однако ON DELETE CASCADE, как известно, медленный; если это большая работа, обычно лучше сначала удалить всех детей. –

ответ

2
SELECT dc.constraint_name, dc.constraint_type, dc.owner, dc.table_name 
FROM dba_cons_columns dcc 
JOIN dba_constraints dc ON (dcc.constraint_name = dc.r_constraint_name and dc.owner = dcc.owner) 
WHERE dcc.owner = 'OWNER_NAME' and dcc.table_name = 'TABLE_NAME'; 
+0

Мне пришлось изменить вторую строку на 'FROM dba_cons_columns dcc JOIN dba_constraints dc ON (dcc.constraint_name = dc.r_constraint_name и dc.owner = dcc.owner)', потому что у нескольких владельцев одинаковые имена ограничений. –

+0

Хороший улов. Я обновил свой ответ. Благодарю. –

1

Проверить all_constraints и all_cons_columns словари.

+0

Я не вижу столбец в словарях, которые говорят вам, в какой таблице используется внешний ключ, поэтому, если я выберу * из all_constraints, где table_name = 'CLIENT'', и он показывает мне все индексы и ограничения на 'CLIENT' , но я не могу найти запрос, который показывает мне, какие таблицы имеют внешний ключ в КЛИЕНТЕ. –

+0

О, но если я выберу * из all_constraints, где r_constraint_name = 'PK__CLIENT'', он делает то, что я хочу. В основном. –