Oracle - удалить ограничения таблицы без удаления таблиц

Я делаю массовую миграцию большой базы данных Oracle. Первым шагом в этом является переименование целой загрузки таблиц в качестве подготовки к удалению их позже (но мне нужно пока хранить в них данные). Любые ограничения внешнего ключа на них должны быть сняты - они вообще не должны быть связаны с остальной частью базы данных. Если бы я их сейчас отбрасывал, я мог бы использовать CASCADE CONSTRAINTS, но переименование просто изменяет ограничения.

Есть ли способ, которым я могу отбросить все ограничения, которые CASCADE CONSTRAINTS будут отбрасывать, не удаляя саму таблицу?

2 ответа

Решение

Вы можете сделать это с помощью динамического SQL и словаря данных:

begin
    for r in ( select table_name, constraint_name
               from user_constraints
               where constraint_type = 'R' )
    loop
        execute immediate 'alter table '|| r.table_name
                          ||' drop constraint '|| r.constraint_name;
    end loop;
end;

Если таблицы принадлежат более чем одному пользователю, вам нужно будет извлечь из DBA_CONSTRAINTS и включить OWNER в проекцию и выполненный оператор. Если вы хотите потрогать меньше, чем все таблицы, боюсь, вам нужно будет указать список в предложении WHERE, если только в их именах нет какого-либо паттерна.

Вы можете отключить / снова включить ограничения, не удаляя их. Посмотрите на эту статью.

Другие вопросы по тегам