Как найти зависимости внешнего ключа, указывающие на одну запись в Oracle?

У меня есть очень большая база данных Oracle со многими много таблиц и миллионы строк. Я должен удалить один из них, но хотеть удостовериться, что отбрасывание его не повредит никакие другие зависимые строки, которые указывают на него как запись внешнего ключа. Существует ли способ получить список всех других записей, или по крайней мере схемы таблицы, ту точку к этой строке? Я знаю, что мог просто попытаться удалить его сам и поймать исключение, но я не буду запускать скрипт сам и нуждаться в нем для выполнения чистый в первый раз через.

У меня есть инструменты SQL Developer from Oracle, и МН Разработчик / Разработчик SQL от AllRoundAutomations в моем распоряжении.

Заранее спасибо!

21
задан daveslab 24 March 2010 в 16:36
поделиться

2 ответа

Я всегда смотрю на внешние ключи для начальной таблицы и возвращаюсь назад. Инструменты БД обычно имеют узел зависимостей или ограничений. Я знаю, что у PL / SQL Developer есть способ увидеть FK, но я давно не использовал его, поэтому я не могу его объяснить ...

просто замените XXXXXXXXXXXX именем таблицы ...

/* The following query lists all relationships */ 

select
 a.owner||'.'||a.table_name "Referenced Table"
,b.owner||'.'||b.table_name "Referenced by"
,b.constraint_name "Foreign Key"
from all_constraints a, all_constraints b 
where 
b.constraint_type = 'R'
and a.constraint_name = b.r_constraint_name 
and b.table_name='XXXXXXXXXXXX' -- Table name 
order by a.owner||'.'||a.table_name
26
ответ дан 29 November 2019 в 06:21
поделиться

Мы можем использовать словарь данных для идентификации таблиц, которые ссылаются на первичный ключ рассматриваемой таблицы. Исходя из этого, мы можем сгенерировать некоторый динамический SQL для запроса в этих таблицах значения, которое мы хотим записать:

SQL> declare
  2      n pls_integer;
  3      tot pls_integer := 0;
  4  begin
  5      for lrec in ( select table_name from user_constraints
  6                    where r_constraint_name = 'T23_PK' )
  7      loop
  8          execute immediate 'select count(*) from '||lrec.table_name
  9                              ||' where col2 = :1' into n using &&target_val;
 10          if n = 0 then
 11              dbms_output.put_line('No impact on '||lrec.table_name);
 12          else
 13              dbms_output.put_line('Uh oh! '||lrec.table_name||' has '||n||' hits!');
 14          end if;
 15          tot := tot + n;
 16      end loop;
 17      if tot = 0
 18      then
 19          delete from t23 where col2 = &&target_val;
 20          dbms_output.put_line('row deleted!');
 21      else
 22          dbms_output.put_line('delete aborted!');
 23      end if;
 24  end;
 25  /
Enter value for target_val: 6
No impact on T34
Uh oh! T42 has 2 hits!
No impact on T69
delete aborted!

PL/SQL procedure successfully completed.

SQL>

Этот пример немного обманывает. Имя целевого первичного ключа жестко запрограммировано, а ссылочный столбец имеет одно и то же имя во всех зависимых таблицах. Решение этих проблем оставлено в качестве упражнения для читателя;)

3
ответ дан 29 November 2019 в 06:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: