主キーのないテーブルを移行する

このページでは、主キーのない Oracle テーブルを移行する方法について説明します。

主キーの自動生成の概要

主キーのないテーブルでは、一貫したレプリケーションが保証されません。Database Migration Service は、主キーを持つテーブルのみを移行します。移行元データベースに主キーのないテーブルが含まれている場合、Database Migration Service は次の方法で処理できます。

  • ソースコードとスキーマを変換すると、Database Migration Service は、宛先テーブルに ROWID 列を追加することで、欠落している主キーを自動的に作成できます。この自動プロセスでは、ソーステーブルが次の条件を満たしている必要があります。
    • 主キーがまだない。
    • null 値を許容しない列がない UNIQUE 制約を設定しないでください。
    • null 値を許容しない列を含む UNIQUE インデックスを作成しないでください。
    テーブルがこれらの要件を満たしていない場合は、変換された PostgreSQL スキーマのテーブルに、不足している主キーを手動で追加する必要があります。
  • 以前のコンバージョン ワークスペースでは、Database Migration Service は主キーを自動的に作成しません。以前のコンバージョン ワークスペースを使用している場合は、変換された PostgreSQL スキーマのテーブルに、欠落している主キーを手動で追加する必要があります。

欠落している主キーを手動で追加する

主キーのない Oracle テーブルを移行するには、次の操作を行います。

  1. コンバージョン ワークスペースを使用して、ソースコードとスキーマを変換します。
  2. SQL クライアントを使用して、移行先の Cloud SQL インスタンスに接続します。次のメソッドを使用できます。
    • psql クライアント。この方法を使用してインスタンスのプライベート IP に接続できますが、Compute Engine 仮想マシンの作成が必要になる場合があります。
    • gcloud sql connect コマンド。このコマンドは、パブリック IP アドレスが有効になっている Cloud SQL インスタンスでのみ機能します。
  3. テーブルに欠落している主キー制約を作成します。主キーの詳細については、PostgreSQL ドキュメントの 主キーをご覧ください。

    次のセクションを開いて、SQL コマンドのサンプルを確認することもできます。

    既存の列を使用して主キーを作成する

    テーブルには、列または列の組み合わせに基づく論理主キーがすでに存在する場合があります。たとえば、一意の制約またはインデックスが構成された列が存在する場合があります。これらの列を使用して、ソース データベースのテーブルに新しい主キーを生成します。次に例を示します。

    ALTER TABLE TABLE_NAME
    ADD PRIMARY KEY (COLUMN_NAME);

    次のように置き換えます。

    • TABLE_NAME は、主キーのないテーブルの名前に置き換えます。
    • COLUMN_NAME は、主キーとして使用できる一意の制約またはインデックスを持つ列の名前に置き換えます。

    すべての列を使用して主キーを作成する

    主キーとして機能する既存の制約がない場合は、テーブルのすべての列を使用して主キーを作成します。PostgreSQL インスタンスで許可されている主キーの最大長を超えないようにしてください。

    この方法で複合主キーを作成する場合は、使用するすべての列名を明示的にリストする必要があります。この目的のために、ステートメントを使用してすべての列名を取得することはできません。次に例を示します。

    ALTER TABLE TABLE_NAME
    ADD PRIMARY KEY (COLUMN_NAME_1, COLUMN_NAME_2, COLUMN_NAME_3, ...);

    次のように置き換えます。

    • TABLE_NAME は、主キーのないテーブルの名前に置き換えます。
    • COLUMN_NAME_1、COLUMN_NAME_2 などは、主キーの作成に使用する列の名前に置き換えます。

    ROWID 疑似列を使用して一意の制約を作成する

    Oracle データベースでは、 ROWID 疑似列を使用して、テーブル内の各行の場所を保存します。主キーのない Oracle テーブルを移行するには、移行先の PostgreSQL データベースに ROWID 列を追加します。Database Migration Service は、ソース Oracle ROWID 疑似列の対応する数値で列に値を入力します。

    列を追加して主キーとして設定するには、次のコマンドを実行します。

    ALTER TABLE TABLE_NAME ADD COLUMN rowid numeric(33,0) NOT NULL;
    CREATE SEQUENCE TABLE_NAME_rowid_seq INCREMENT BY -1 START WITH -1 OWNED BY TABLE_NAME.rowid;
    ALTER TABLE TABLE_NAME ALTER COLUMN rowid SET DEFAULT nextval('TABLE_NAME_rowid_seq');
    ALTER TABLE TABLE_NAME ADD CONSTRAINT CONSTRAINT_DISPLAY_NAME PRIMARY KEY (rowid);

    次のように置き換えます。

    • TABLE_NAME は、列を追加するテーブルの名前に置き換えます。
    • CONSTRAINT_DISPLAY_NAME は、PRIMARY KEY 制約の ID に置き換えます。

次のステップ