大規模なOracleデータベースの一括移行を行っています。この最初のステップでは、後でドロップする準備として、テーブルのロード全体の名前を変更します(ただし、今のところ、テーブル内のデータを保持する必要があります)。それらに対する外部キー制約はすべて削除する必要があります。データベースの残りの部分に接続しないでください。今それらを削除する場合、CASCADE CONSTRAINTSを実行できますが、名前を変更すると制約が変更されるだけです。
テーブル自体を削除せずに、CASCADE CONSTRAINTSが削除するすべての制約を削除する方法はありますか?
動的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句でリストを指定する必要があります。
制約を削除せずに無効化/再有効化できます。 この記事 を見てください。