

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 仮想生成列をOracleから PostgreSQL に移行
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql"></a>

*Amazon Web Services、Veeranjaneyulu Grandhi、Rajesh Madiwale、Ramesh Pathuri*

## 概要
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-summary"></a>

バージョン11以前では、PostgreSQLはOracle仮想列と直接同等の機能を提供していません。Oracle Database から PostgreSQL バージョン 11 以前への移行中に仮想生成された列を処理するのは、次の 2 つの理由で困難です。 
+ 仮想列は移行中は表示されません。
+ PostgreSQLはバージョン12より前の`generate`式をサポートしていません。

ただし、同様の機能をエミュレートする回避策があります。AWS Database Migration Service (AWS DMS) を使用して、Oracle Database から PostgreSQL バージョン 11 以前にデータを移行する場合、トリガー関数を使用して仮想生成列に値を入力できます。このパターンは、この目的に使用できる Oracle データベースと PostgreSQL コードの例を示しています。AWS では、PostgreSQL データベースには Amazon Relational Database Service (Amazon RDS) または Amazon Aurora PostgreSQL 互換エディションを使用できます。

PostgreSQL バージョン 12 以降では、生成された列がサポートされています。生成された列は、他の列値からその場で計算することも、計算して保存することもできます。「[PostgreSQL で生成されたカラム](https://www.postgresql.org/docs/12/ddl-generated-columns.html)」はOracleの仮想カラムに似ています。

## 前提条件と制限
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-prereqs"></a>

**前提条件**
+ アクティブな AWS アカウント。
+ ソース: Oracle データベース 
+ PostgreSQL データベースをターゲットとします (Amazon RDS for PostgreSQL または Aurora PostgreSQL との互換性あり)
+ [PL/PgSQL](https://www.postgresql.org/docs/current/plpgsql.html) コーディングの専門知識

**制限事項**
+ バージョン 12 より前のバージョンの PostgreSQL にのみ適用されます。 
+ Oracle データベースバージョン 11g 以降に適用されます。
+ 仮想列はデータ移行ツールではサポートされていません。
+ 同じテーブルで定義されている列にのみ適用されます。
+ 仮想生成列が決定論的ユーザー定義関数を参照している場合、その列をパーティショニングキー列として使用することはできません。
+ 式の出力はスカラー値でなければなりません。Oracle が提供するデータ型、ユーザー定義型、`LOB`または`LONG RAW`を返すことはできません。
+ 仮想列に対して定義されるインデックスは、PostgreSQLの関数ベースのインデックスと同等です。
+ テーブル統計を収集する必要があります。

## ツール
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-tools"></a>
+ 「[pgAdmin 4](https://www.pgadmin.org/)」は PostgreSQL 用のオープンソース管理ツールです。このツールは、データベースオブジェクトの作成、保守、使用を簡素化するグラフィカルインターフェイスを提供します。
+ 「[Oracle SQL Developer](https://www.oracle.com/database/sqldeveloper/)」は、従来のデプロイメントとクラウドデプロイメントの両方で Oracle データベース内の SQL を操作できる、無料の統合開発環境です。 

## エピック
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-epics"></a>

### ソースデータベースとターゲットデータベーステーブルの作成
<a name="create-source-and-target-database-tables"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| ソース Oracle データベーステーブルを作成します。 | Oracle Database で、次の文を使用して仮想生成列を含むテーブルを作成します。<pre>CREATE TABLE test.generated_column<br />( CODE NUMBER,<br />STATUS VARCHAR2(12) DEFAULT 'PreOpen',<br />FLAG CHAR(1) GENERATED ALWAYS AS (CASE UPPER(STATUS) WHEN 'OPEN' THEN 'N' ELSE 'Y' END) VIRTUAL VISIBLE<br />);</pre><br />このソーステーブルでは、`STATUS`列のデータが AWS DMS を介してターゲットデータベースに移行されます。ただし、この`FLAG`列には`generate by`機能を使用してデータが入力されるため、移行中は AWS DMS にこの列は表示されません。`generated by`の機能を実装するには、次のエピックに示すように、ターゲットデータベースのトリガーと関数を使用して`FLAG`列の値を入力する必要があります。 | DBA、アプリ開発者 | 
| AWS にターゲット PostgreSQL テーブルを作成します。 | 次のステートメントを使用して AWS のPostgreSQLテーブルを作成します。<pre>CREATE TABLE test.generated_column<br />(<br />    code integer not null,<br />    status character varying(12) not null ,<br />    flag character(1)<br />);</pre><br />このテーブルでは、`status`列は標準列です。この`flag`列は、`status`列内のデータに基づいて生成された列になります。 | DBA、アプリ開発者 | 

### PostgreSQL で仮想列を処理するトリガー関数を作成する
<a name="create-a-trigger-function-to-handle-the-virtual-column-in-postgresql"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| PostgreSQL トリガーを作成します。 | PostgreSQL で、トリガーを作成します。<pre>CREATE TRIGGER tgr_gen_column<br />AFTER INSERT OR UPDATE OF status ON test.generated_column<br />FOR EACH ROW <br />EXECUTE FUNCTION test.tgf_gen_column();</pre> | DBA、アプリ開発者 | 
| PostgreSQL トリガー関数を作成します。 | PostgreSQL で、トリガー用の関数を作成します。この関数は、アプリケーションまたは AWS DMS によって挿入または更新された仮想列を入力し、データを検証します。<pre>CREATE OR REPLACE FUNCTION test.tgf_gen_column() RETURNS trigger AS $VIRTUAL_COL$<br />BEGIN<br />IF (TG_OP = 'INSERT') THEN<br />IF (NEW.flag IS NOT NULL) THEN<br />RAISE EXCEPTION 'ERROR: cannot insert into column "flag"' USING DETAIL = 'Column "flag" is a generated column.';<br />END IF;<br />END IF;<br />IF (TG_OP = 'UPDATE') THEN<br />IF (NEW.flag::VARCHAR != OLD.flag::varchar) THEN<br />RAISE EXCEPTION 'ERROR: cannot update column "flag"' USING DETAIL = 'Column "flag" is a generated column.';<br />END IF;<br />END IF;<br />IF TG_OP IN ('INSERT','UPDATE') THEN<br />IF (old.flag is NULL) OR (coalesce(old.status,'') != coalesce(new.status,'')) THEN<br />UPDATE test.generated_column<br />SET flag = (CASE UPPER(status) WHEN 'OPEN' THEN 'N' ELSE 'Y' END)<br />WHERE code = new.code;<br />END IF;<br />END IF;<br />RETURN NEW;<br />END<br />$VIRTUAL_COL$ LANGUAGE plpgsql;</pre> | DBA、アプリ開発者 | 

### AWS DMS を使用してデータ移行をテストする
<a name="test-data-migration-by-using-aws-dms"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| レプリケーションインスタンスを作成します。 | レプリケーションインスタンスを作成するには、AWS DMS ドキュメントの「[指示](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_ReplicationInstance.Creating.html)」に従います。レプリケーションインスタンスは、ソースデータベースとターゲットデータベースと同じ 仮想プライベートクラウド (VPC) 内に存在する必要があります。 | DBA、アプリ開発者 | 
| ソースおよびターゲットエンドポイントを作成します。 | エンドポイントを作成するには、AWS DMS のドキュメントの[手順](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Endpoints.Creating.html)に従います。 | DBA、アプリ開発者 | 
| エンドポイント接続をテストします。 | VPC とレプリケーションインスタンスを指定し、「**テストを実行**」を選択すると、エンドポイント接続をテストできます。 | DBA、アプリ開発者 | 
| フルロードタスクを作成して開始します。 | 手順については、AWS DMS ドキュメントの「[タスクの作成](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.Creating.html)」と「[フルロードタスク設定](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TaskSettings.FullLoad.html)」を参照してください。 | DBA、アプリ開発者 | 
| 仮想列のデータを検証します。 | ソースデータベースとターゲットデータベース内の仮想列のデータを比較します。データを手動で検証することも、このステップのスクリプトを記述することもできます。 | DBA、アプリ開発者 | 

## 関連リソース
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-resources"></a>
+ [AWS Database Migration Service の使用開始](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_GettingStarted.html) (AWS DMSドキュメント)
+ 「[AWS DMSのソースとして Oracle データベースを使用](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.Oracle.html)」 (AWS DMS ドキュメント)
+ [PostgreSQL データベースを AWS DMS のターゲットとして使用する](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.PostgreSQL.html) (AWS DMS ドキュメント)
+ [PostgreSQL で生成されたカラム](https://www.postgresql.org/docs/12/ddl-generated-columns.html) (PostgreSQL ドキュメント)
+ [トリガー関数](https://www.postgresql.org/docs/12/plpgsql-trigger.html) (PostgreSQL ドキュメンテーション)
+ Oracle データベースの[仮想カラム](https://docs.oracle.com/database/121/SQLRF/statements_7002.htm#SQLRF01402) (Oracle ドキュメント)