Как отсортировать вставки в нескольких таблицах на Oracle, чтобы не нарушать ограничение FK - PullRequest
0 голосов
/ 15 января 2020


Мне нужно перенести БД с Oracle 12 на Oracle 11. Я создал все DDL для объектов, используя SQL Explorer, и после некоторых небольших корректировок он работал нормально. Но когда я экспортировал данные, я получил набор вставок , отсортированных по имени таблицы , как показано ниже.

@C:\Users\RubensdoAmaralNeto\DBScripts\TABLE_A.sql
@C:\Users\RubensdoAmaralNeto\DBScripts\TABLE_B.sql
@C:\Users\RubensdoAmaralNeto\DBScripts\TABLE_C.sql
...

Если я попытаюсь запустить его как есть, он не будет работать, потому что это нарушает многие ограничения FK.

Есть ли способ сортировки этих вставок, кроме ручного выполнения работы? Может быть, используя SQL Explorer или SQLPlus. Существует более 150 таблиц, которые связаны друг с другом.

1 Ответ

1 голос
/ 15 января 2020

Вот рекурсивный CTE, который, я думаю, должен перечислять все ваши таблицы в порядке, в котором вы должны выполнять вставки. Предполагая, что все таблицы находятся в вашей текущей схеме. Все с уровнем 0 может быть запущено в любом порядке.

with t (table_name, lvl) as (
    -- tables with no foreign keys on them
    select table_name, 0 as lvl from user_tables where table_name not in (select table_name from user_constraints where constraint_type = 'R')
    union all -- tables with foreign keys pointing to previous tables 
    select c.table_name as table_name, t.lvl+1 as lvl
    from t 
    join user_constraints r on r.table_name = t.table_name
    join user_constraints c 
      on c.constraint_type = 'R' 
      and r.constraint_name = c.r_constraint_name
    ) cycle table_name set is_cycle to 1 default 0
select table_name, lvl,
  '@C:\Users\RubensdoAmaralNeto\DBScripts\' || table_name || '.sql' as script
from t
order by lvl;

Просто скопируйте и вставьте третий столбец в текстовый файл и сохраните скрипт.

...