AWS Schema Conversion Tool ブログシリーズ: ビルド 617 の新機能紹介
AWS Schema Conversion Tool ブログシリーズ: ビルド 617 の新機能紹介:
今回は、AWS Schema Conversion Tool (AWS SCT) 新バージョンをご紹介します。このバージョンには、テーブル値関数の変換のサポート、サーバーレベルの評価レポートへの追加情報などが含まれます。
AWS SCT とは、あるデータベースエンジン上の既存のデータベーススキーマを別のデータベースエンジン用に変換するためのツールです。リレーショナル OLTP スキーマやサポート対象のデータウェアハウス OLAP スキーマを Amazon RDS に変換することができます。たとえば、MySQL や PostgreSQL などと互換性があるため、Amazon Aurora に変換できます。また、リレーショナル OLTP スキーマやサポート対象のデータウェアハウス OLAP スキーマを Amazon Redshift に変換することも可能です。サポートされているすべてのソースおよびターゲットは、AWS SCT ドキュメントで確認できます。
以下に、この記事で説明するトピックの概要を示します。
バージョン 617 では、複数ステートメントのテーブル値関数は、元のテーブル値関数と同様の構造のテーブルを返します。 一時テーブルは複数ステートメントのテーブル値関数内部でのみ使われ、SQL Server で使用される可能性があるすべての DML をエミュレートします。 複数ステートメントのテーブル値関数外部では一時テーブルを使用しません。
以下にこの変更についての例を示します。
以下の例では、プロシージャとテーブル型に SQL Server ソースで作成された SELECT ステートメントを使用しています。
ソース (SQL Server) のテーブル型とプロシージャ:
以下の画像は、AWS SCT によってテーブル型を模してターゲットのデータベースに作成されたオブジェクトを示しています。ここで、SQL Server のテーブル型
AWS SCT に変換されるコード (MySQL):
以下の例では、AWS SCT が SQL Server プロシージャ (
こちらのプロシージャ例では、WHEN NOT MATCHED 句 1 つのみの MERGE を使用しています。
AWS SCT では、以下のような MERGE ステートメントもサポートしています。
以下の例では、パーティションキーが
以下に、ターゲットのデータベースを評価する際に役立つサーバーレベルオブジェクトを示します。すべての一覧については、AWS SCT リリースノートをご覧ください。
以下に役立つ新しいオブジェクトをご紹介します。
こちらは、SQL Server から Amazon RDS の SQL Server への移行についてのサーバーレベル評価レポートのスナップショットです。
これらの機能は、お客様からのフィードバックに基づき実装しました。コメントおよび提案をいただき感謝いたします。次回の記事をお楽しみに。
今回は、AWS Schema Conversion Tool (AWS SCT) 新バージョンをご紹介します。このバージョンには、テーブル値関数の変換のサポート、サーバーレベルの評価レポートへの追加情報などが含まれます。
AWS SCT とは、あるデータベースエンジン上の既存のデータベーススキーマを別のデータベースエンジン用に変換するためのツールです。リレーショナル OLTP スキーマやサポート対象のデータウェアハウス OLAP スキーマを Amazon RDS に変換することができます。たとえば、MySQL や PostgreSQL などと互換性があるため、Amazon Aurora に変換できます。また、リレーショナル OLTP スキーマやサポート対象のデータウェアハウス OLAP スキーマを Amazon Redshift に変換することも可能です。サポートされているすべてのソースおよびターゲットは、AWS SCT ドキュメントで確認できます。
以下に、この記事で説明するトピックの概要を示します。
- Microsoft SQL Server から PostgreSQL へ – テーブル値関数の変換
- SQL Server から PostgreSQL/MySQL へ – テーブル型変数の変換
- SQL Server から PostgreSQL へ – MERGE ステートメントの実装
- Oracle から PostgreSQL 10 へ – タイムゾーンデータなしで、列によるパーティションへのタイムスタンプ変換をサポート
- Oracle から Amazon RDS for Oracle へ – 追加のサーバーレベルオブジェクト
- SQL Server から Amazon RDS for SQL Server へ – 追加のサーバーレベルオブジェクト
SQL Server から PostgreSQL へ – テーブル値関数
AWS SCT バージョン 616 では、複数ステートメントのテーブル値関数のエミュレーションで、データへのアクセスに一時テーブルを使用していました。AWS SCT は、まず一時テーブルを作成、データを入力して、テーブル値関数にアクセスする代わりにその一時テーブルにアクセスしていました。バージョン 617 では、複数ステートメントのテーブル値関数は、元のテーブル値関数と同様の構造のテーブルを返します。 一時テーブルは複数ステートメントのテーブル値関数内部でのみ使われ、SQL Server で使用される可能性があるすべての DML をエミュレートします。 複数ステートメントのテーブル値関数外部では一時テーブルを使用しません。
以下にこの変更についての例を示します。
SQL Server テーブル型の実装
ユーザー定義のテーブル型はデータベースオブジェクトとして作成され、属性名とデータ型の一覧で定義されます。ユーザー定義のテーブル型として宣言されたテーブル値パラメータを使用すると、一時テーブルや多数のパラメーターを作成せずに、複数のデータ行を Transact-SQL ステートメントやルーチン (ストアドプロシージャや関数など) に送ることができます。ターゲット: PostgreSQL および MySQL の場合
PostgreSQL および MySQL では、ユーザー定義のテーブル型をサポートしていませんが、一時テーブルを使用することで同様の機能を実行できます。以下の例では、プロシージャとテーブル型に SQL Server ソースで作成された SELECT ステートメントを使用しています。
ソース (SQL Server) のテーブル型とプロシージャ:
CREATE TYPE Employee2Client AS TABLE(
EmployeeID INT
, EmployeeName VARCHAR(160)
, ClientID INT
, ClientName VARCHAR(160)
)
CREATE PROCEDURE [dbo].[PROC_CREATE_PROC_005]
@p_E2C Employee2Client READONLY
AS
BEGIN
SELECT *
FROM @p_E2C
WHERE UPPER(ClientName)
LIKE CONCAT('%', UPPER('bank'), '%');
END;
ターゲット: PostgreSQL の場合
以下のオブジェクトが PostgreSQL でテーブル型のエミュレート用に作成されます。- 複合型
- ドメイン: 複合型の配列として宣言
- 関数: 一時テーブルを作成
CREATE TYPE ramya_dbo.employee2client$aws$t AS (
employeeid NUMERIC(10,0),
employeename VARCHAR(160),
clientid NUMERIC(10,0),
clientname VARCHAR(160)
);
CREATE DOMAIN ramya_dbo.employee2client AS
ramya_dbo.employee2client$aws$t [] NOT NULL;
CREATE OR REPLACE FUNCTION ramya_dbo.employee2client$aws$f
(IN variable_name VARCHAR)
RETURNS void
AS
$BODY$
BEGIN
EXECUTE 'DROP TABLE IF EXISTS ' || variable_name;
EXECUTE 'CREATE TEMPORARY TABLE '
|| variable_name || ' ramya_dbo.employee2client$aws$t WITH OIDS;';
END;
$BODY$
LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION ramya_dbo.proc_create_proc_005
(IN par_p_e2c ramya_dbo.employee2client, OUT p_refcur refcursor)
AS
$BODY$
BEGIN
OPEN p_refcur FOR
SELECT
*
FROM par_p_e2c$aws$tmp
WHERE LOWER(UPPER(clientname))
LIKE LOWER(CONCAT('%', UPPER('bank'), '%'));
END;
$BODY$
LANGUAGE plpgsql;
Employee2Client
が PostgreSQL に変換されたことがわかります。ターゲット: MySQL の場合
MySQL はテーブル型のパラメーターをサポートしていませんが、この機能を一時テーブルを使用して再現できます。一時テーブルは MySQL のセッションとの接続切断後に削除されるため、接続ごとに毎回作成する必要があります。AWS SCT に変換されるコード (MySQL):
CREATE PROCEDURE RAMYA_dbo.PROC_CREATE_PROC_005(in par_p_E2C VARCHAR(255))
BEGIN
DROP TEMPORARY TABLE IF EXISTS par_p_E2C$PROC_CREATE_PROC_005;
SET @aws$tbl$stmt :=
CONCAT('CREATE TEMPORARY TABLE par_p_E2C$PROC_CREATE_PROC_005
SELECT * FROM ', par_p_E2C);
PREPARE aws$tbl$stmt FROM @aws$tbl$stmt;
EXECUTE aws$tbl$stmt;
DEALLOCATE PREPARE aws$tbl$stmt;
SELECT
*
FROM par_p_E2C$PROC_CREATE_PROC_005
WHERE UPPER(ClientName) LIKE CONCAT('%', UPPER('bank'), '%');
END;
PROC_CREATE_PROC_005
) を MySQL に変換する方法を示しています。SQL Server から PostgreSQL へ – MERGE ステートメントの実装
SQL Server での MERGE は、ソースのテーブルとの統合結果に基づき、ターゲットのテーブルで挿入、更新、削除を実行します。PostgreSQL では MERGE ステートメントをサポートしていませんが、INSERT ON CONFLICT 句を使用して同様の機能を実行できます。こちらのプロシージャ例では、WHEN NOT MATCHED 句 1 つのみの MERGE を使用しています。
AWS SCT では、以下のような MERGE ステートメントもサポートしています。
- テーブルからの MERGE
- ビューからの MERGE
- サブクエリからの MERGE
- WHEN MATCHED 句なしの MERGE
- WHEN NOT MATCHED 句なしの MERGE
- INSERT あり、フィールドリストなしの MERGE
- ON 条件の複雑な MERGE
- 2 つの WHEN MATCHED THEN 句 (現時点でサポート外)
- WHEN NOT MATCHED BY SOURCE 句 (現時点でサポート外)
Oracle から PostgreSQL 10 へ – タイムゾーンデータなしで、列によるパーティションへのタイムスタンプ変換
今回のバージョンより、AWS SCT では Oracle から PostgreSQL 10 への移行時に、タイムゾーンのデータ型なしのタイムスタンプ付きでのパーティション列の移行をサポートしています。以下の例では、パーティションキーが
Call_Date
、データ型が timestamp
の Oracle パーティションテーブルを示しています。AWS SCT は、このテーブルを call_date
でパーティションテーブルに変換し、Oracle パーティションに対応する 4 つのパーティションを PostgreSQL ターゲットに作成します。Oracle から Amazon RDS for Oracle へ – 追加のサーバーレベルオブジェクト
AWS SCT の前回のリリースでは、サーバーレベルの評価レポートを導入しました。今回のリリースでは、評価レポートに多数のオブジェクトを新しく追加しました。以下に、ターゲットのデータベースを評価する際に役立つサーバーレベルオブジェクトを示します。すべての一覧については、AWS SCT リリースノートをご覧ください。
- DB インスタンス制限
- 文字セット
- Data Guard および Active Data Guard
- Automatic Storage Management
- レプリケーション
- エンタープライズユーザーセキュリティ
- Streams
- XML DB
- Oracle Application Express (APEX)
- REDO ログ生成
レプリケーション: Amazon RDS for Oracle ではレプリケーションをサポートしていません 評価レポート: Amazon RDS for Oracle では、データキャプチャーの変更を行う PL/SQL パッケージをサポートしていません。データのレプリケーションには、 Amazon RDS Multi-AZ および AWS DMS をお試しください。また、Oracle XML DB の機能を使用していれば、レポートでサポート外の内容と関連するドキュメントがわかる場合もあります。
Oracle XML DB プロトコルサーバー: 評価レポート: Oracle XML DB。Amazon RDS for Oracle では XML DB の機能をサポートしますが、 XML DB プロトコルサーバーはサポートしません。次の記事の前提条件と設定の手順を お読みください: Oracle XML DB オプション以下に、Oracle から RDS for Oracle への変換におけるサーバーレベル評価レポートの実際例を示します。
SQL Server から Amazon RDS へ – 追加の SQL Server オブジェクト
前セクションで説明した Oracle から RDS for Oracle への移行レポート同様、SQL Server から RDS for SQL Server への移行でも追加のオブジェクトがあります。以下に役立つ新しいオブジェクトをご紹介します。
- ミラーリング
- ログ配布
- AlwaysON
- クラスターノード
- データベースメール
- Reporting services
- Analysis services
- Integration services
- フルテキスト検索サービス
- Data quality services
こちらは、SQL Server から Amazon RDS の SQL Server への移行についてのサーバーレベル評価レポートのスナップショットです。
結論
ビルド 617 には、この記事でお知らせした機能以外にもいくつかの改良を加えました。AWS SCT リリースノートページで、機能の全リストにアクセスできます。これらの機能は、お客様からのフィードバックに基づき実装しました。コメントおよび提案をいただき感謝いたします。次回の記事をお楽しみに。
コメント
コメントを投稿