Amazon Web Services ブログ
SQL Server MERGE ステートメントを例にした SQL ステートメントの Babelfish for Aurora PostgreSQL 移行ベストプラクティス
SQL Server データベースを Babelfish for Aurora PostgreSQL に移行するには、通常、自動タスクと手動タスクの両方を実行する必要があります。自動化タスクには、-rewrite
フラグの付いた Babelfish Compass ツールを使用した自動コード変換と、AWS Database Migration Service (AWS DMS) を使用したデータ移行が含まれます。手動タスクには、Babelfish Compass ツールを使用したデータベース互換性チェック、Babelfish でサポートされていない特定のデータベースオブジェクトの移行回避策、および結果の手動検証が含まれます。
この投稿では、SQL Server の MERGE ステートメントを Babelfish 互換の T-SQL コードに自動的に変換する Babelfish Compass ツールの -rewrite
フラグ機能に焦点を当てます。この記事で紹介した一例が MERGE ステートメントですが、-rewrite
は他の機能にも使用できます。また、結果を手動で検証するベストプラクティスについても説明します。
Babelfish Compass を使用すると、ソースである SQL Server データベースがターゲットの Babelfish データベースと互換性があるかどうか、および Babelfish で現在サポートされていない機能や移行できない機能を確認できます。
PostgreSQL 15 は MERGE をサポートしていますが、Babelfish はまだサポートしていません。また、PostgreSQL の MERGE は SQL Server の MERGE と完全には同じではありません。たとえば、「RETURNING」や「NOT MATCHED BY SOURCE」という句はサポートされていません。
Babelfish Compass の -rewrite フラグの概要
-rewrite
フラグを使用すると、Babelfish Compass 評価レポートの「unsupported」セクションに含まれている MERGE ステートメントを変換することができます。
コマンドプロンプトで Babelfish Compass ツールを実行します。
Mac および Linux でコンパスを実行するための手順はこちら。
-rewrite
フラグは、Babelfish Compass 評価レポートで、Babelfish ターゲットとの互換性を確保するために SQL コードを手動で書き直すよう提案されている場合に役立ちます。
Babelfish-compatible の T-SQL コードに変換する手作業の一部を取り除くことができます。ただし、対応する書き換えられた SQL コードを注意深く確認する必要もあります。
SQL Server の MERGE ステートメントの理解
SQL Server の MERGE は、挿入、更新、削除を 1 つのステートメントとトランザクションにまとめます。MERGE ステートメントは、ソーステーブルから行を選択し、1 回のトランザクションでターゲットテーブルに対して複数の DML 操作を実行します。
SQL Server MERGE のシナリオを示すために、SQL Server データベースと Babelfish に次のテストテーブルを作成します。
Person_Target
はターゲットテーブルで Person_Source
はソースで、その行はマージ条件に基づいて Person_Target
テーブルにマージされます。
次の INSERT ステートメントは、Person_Source
テーブルと Person_Target
テーブルにサンプルデータを挿入します。
次のコードは、Person_Source
テーブルのデータを Person_Target
テーブルにマージします。MERGE の後のセミコロンは実際には必須です。
Person_Target
テーブルの各行について、SQL Server はマージ条件と呼ばれる検索条件を評価します。条件が一致すると、結果が true になり、SQL Server は Person_Source
テーブルの対応するデータでターゲットテーブルの行を更新します。どの行でも条件に一致しない場合、結果は false となり、SQL Server は対応する行をソーステーブルからターゲットテーブルに挿入します。ソーステーブルのどの行でも条件が一致しない場合、その行はターゲットから削除されます。次の図は、このワークフローを示しています。
ターゲットテーブルを検証し、Person_Target
テーブル内のデータが前の図と一致するかどうかを確認できます。
Babelfish での SQL Server MERGE ステートメントの書き換え
PostgreSQL の場合、MERGE ステートメントのような構造はありません。ただし、Compass ツールは MERGE を Babelfish の個々の挿入、更新、削除ステートメントとして書き換えることができます。
次のステートメントは、Babelfish に Person_Source
テーブルと Person_Target
テーブルを作成し、データを挿入します。
次のコードは、レポートフォルダー内の rewrite というフォルダー内に自動的に生成されます。
違いの1つは、@@rowcount
は SQL Server と異なるということです。これが、書き直されたコードに @MERGE_RWRITTEN_ROWCOUNT_n
が含まれている理由です。
コードをプロシージャ用に変換した後で、SQL Server テーブルと Babelfish PostgreSQL の person_target
テーブル内のデータが一致していることを確認できます。
考慮事項
MERGE ステートメントが文字列変数で動的に作成される場合、Babelfish Compass ツールを使用して書き換えることはありません。このようなシナリオでは、手動で変換する必要があります。-rewrite
フラグは Babelfish がサポートしていないかぎり MERGE に影響します。いったん機能がサポートされると、-rewrite
はそれ以上書き換えを試みません。
結論
この投稿では、SQL Server で使用される MERGE ステートメントの例を1つ取り上げて、Babelfish Compass ツールの -rewrite
フラグを使用してそれらを同等の Babelfish T-SQL コードに変換する方法を説明しました。
翻訳はソリューションアーキテクトのYoshinori Sawada が担当しました。原文はこちらです。
著者について
Shyam Sunder Rakhecha は、インドのハイデラバードを拠点とする AWS のプロフェッショナルサービスチームのリードコンサルタントで、データベースの移行とモダナイゼーションを専門としています。AWS クラウドの移行と最適化においてお客様を支援しています。彼はデータベースという観点から新しいテクノロジーを探求することと、 RDBMS とビッグデータに興味を持っています。また、チームビルディングのイベントを開催したり、チームで集まったりするのも大好きです。