2010-09-13 5 views
9

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

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

ответ

18

Вы можете сделать это с динамическим 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 loop; 

Если таблицы принадлежат более чем одному пользователю вам нужно проехать от DBA_CONSTRAINTS и включают ВЛАДЕЛЬЦА в проекции и казненных заявление. Если вы хотите коснуться меньше всех таблиц, я боюсь, вам нужно будет указать список в предложении WHERE, если не будет определенного шаблона для их имен.

+0

Это выглядит хорошо. Я добавил несколько ограничений, чтобы отразить, какие таблицы я хочу изменить и уйти с этим. Благодаря! – Submonoid

0

Вы можете отключить/снова включить ограничения, не отбрасывая их. Взгляните на this article.

+0

Правда, но это на самом деле не помогает мне. Я мог бы отключить/отключить отдельные ограничения, но это большая база данных, и я не хочу искать все ограничения, которые ссылаются на таблицы, которые я перемещаю. Я хочу иметь возможность автоматически отбрасывать все ограничения так же, как я мог бы, если бы использовал «DROP TABLE foo CASCADE CONSTRAINTS». – Submonoid