web-dev-qa-db-ja.com

Oracleのテーブルの名前を変更して、すべての外部キー、制約、トリガー、シーケンスを更新し、既存のデータを保持するにはどうすればよいですか?

Oracleでテーブルの名前を変更する必要がありますが、テーブルを参照するすべての外部キー、制約、トリガー、およびシーケンスが新しい名前を使用するように更新されていることを確認します。

何も壊れていないことをどのように確認できますか?

テーブルに含まれている既存のデータを保持したいことに注意してください。

11
Warren Blumenow

これは、「テーブルを参照する外部キー、制約、トリガー、およびシーケンスは、新しい名前を使用するように更新される」という意味によって異なります。

名前を変更するテーブルに対する既存のインデックス、制約、およびトリガーは、自動的に新しい名前を参照します。

ただし、これらのオブジェクトに使用される命名規則では、更新された名前が自動的に使用されることはありません。たとえば、TABLE_NAMEの主キーの名前が一般にTABLE_NAME_PKの場合、TABLE_NAMEの名前をNEW_TABLE_NAMEに変更しても、主キー制約の名前は自動的にNEW_TABLE_NAME_PKに変更されません。

チェックする必要があるのは、古いテーブル名を参照するコード(パッケージ、プロシージャ、関数)と、古いテーブル名を参照するトリガーです。同様に、古いテーブル名に対するビューも壊れます。ビューALL_DEPENDENCIESは、更新が必要なオブジェクトを特定するのに役立ちます。

13
Adam Musch

もし、あんたが

ALTER TABLE old_table_name
 RENAME TO new_table_name;

すべての既存の制約(外部キーおよびその他の制約)とトリガーは、新しく名前が変更されたオブジェクトを参照します。シーケンスはテーブルとの関係がないため、シーケンスへの影響はありません(ただし、テーブルのトリガーでシーケンスを参照している場合、トリガーは名前変更後も同じシーケンスを参照し続けます)。ただし、古いテーブル名を参照するように記述したストアドプロシージャは、新しいテーブル名を参照するように更新する必要があります。

これで、制約とトリガーは引き続き正しく機能しますが、元の名前は保持されます。テーブル名の後に維持したいこれらのオブジェクトの命名規則がある場合、さらに行う必要があります。たとえば、テーブルFOOにトリガーを挿入する前の行レベルにTRG_BI_FOOという名前を付け、テーブルの名前をBARに変更する場合は、トリガーを変更する必要があります。名前を明示的に変更する

ALTER TRIGGER trg_bi_foo
  RENAME TO trg_bi_bar;

同様に、制約とインデックスの名前を変更する必要があります

ALTER TABLE bar
  RENAME CONSTRAINT pk_foo TO pk_bar;
20
Justin Cave
ALTER TABLE oldName RENAME TO newName

テーブルの依存関係とデータは保持されますが、無効になる古い名前を参照するPL/SQLが常に存在する可能性があります。

1
vc 74