Oracle-テーブルをドロップせずにテーブルの制約をドロップします
-
02-10-2019 - |
質問
私は大規模なOracleデータベースのいくつかのバルク移行を行っています。これの最初のステップでは、後でそれらをドロップする準備として、テーブルの全負荷を変更することが含まれます(ただし、今のところデータを保持する必要があります)。それらの外部キーの制約は、ドロップする必要があります - それらは、データベースの残りの部分にまったく接続すべきではありません。私が今それらをドロップしていた場合、私は制約をカスケードすることができますが、名前変更は単に制約を変更します。
カスケードの制約がテーブル自体を落とさずにドロップするすべての制約をドロップする方法はありますか?
解決
動的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から運転し、投影と実行されたステートメントに所有者を含める必要があります。すべてのテーブルよりも少なく触れたい場合は、名前に何らかのパターンがない限り、Where句のリストを指定する必要があるのではないかと心配しています。
他のヒント
制約をドロップせずに無効/再度の制約を無効にすることができます。を見てみましょう この記事.
所属していません StackOverflow