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

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

  • 主キーの自動生成では、 Database Migration Service が主キーのないソーステーブルを処理する方法について説明します。

  • 主キーを手動で追加するでは、変換後のスキーマで主キーを追加するために使用できるクエリの例を示します。

主キーの自動生成の概要

主キーのないテーブルは、一貫したレプリケーションを保証しません。 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_1COLUMN_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 に置き換えます。

次のステップ