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, если только в их именах нет какого-либо паттерна.
Вы можете отключить / снова включить ограничения, не удаляя их. Посмотрите на эту статью.