1. ホーム
  2. sql

[解決済み] Oracleのすべてのテーブル制約を無効にする

2023-01-09 18:37:07

質問

Oracle のすべてのテーブル制約を 1 つのコマンドで無効にするにはどうすればよいですか。 これは、1 つのテーブル、テーブルのリスト、またはすべてのテーブルのいずれでもかまいません。

どのように解決するのですか?

一時的なスプールファイルの書き出しは避けた方がよいでしょう。 PL/SQLブロックを使用します。 SQL*Plusから実行するか、このことをパッケージやプロシージャに入れることができます。 USER_TABLESへの結合は、ビュー制約を回避するためにあります。

すべての制約(NOT NULL、主キーなどを含む)を本当に無効にしたいとは思えません。 WHERE句にconstraint_typeを入れることを考えるべきでしょう。

BEGIN
  FOR c IN
  (SELECT c.owner, c.table_name, c.constraint_name
   FROM user_constraints c, user_tables t
   WHERE c.table_name = t.table_name
   AND c.status = 'ENABLED'
   AND NOT (t.iot_type IS NOT NULL AND c.constraint_type = 'P')
   ORDER BY c.constraint_type DESC)
  LOOP
    dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" disable constraint ' || c.constraint_name);
  END LOOP;
END;
/

外部キー制約で参照する前に、主キー制約を有効にする必要があります。 これは、constraint_typeでORDER BYを使用して行うことができます。 P' = 主キー、'R' = 外部キーです。

BEGIN
  FOR c IN
  (SELECT c.owner, c.table_name, c.constraint_name
   FROM user_constraints c, user_tables t
   WHERE c.table_name = t.table_name
   AND c.status = 'DISABLED'
   ORDER BY c.constraint_type)
  LOOP
    dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" enable constraint ' || c.constraint_name);
  END LOOP;
END;
/