bigquery-migration-sql-translator について
bigquery-migration-sql-translator は、BigQuery Migration Service(BQMS)による旧データベース SQL から GoogleSQL への変換を調整するスキルです。データベース移行向けに、単一・一括変換、Cloud Storage へのステージング、コンパイラーエラーの調査、YAML 設定を扱います。
主な機能
- 01単一 SQL クエリの変換
- 02Cloud Storage 上のファイルの一括変換
- 03データベースメタデータから BigQuery DDL を生成
- 04変換ログとエラーの確認
- 05YAML 変換設定の利用
活用シーン
- 01旧データベースのクエリを GoogleSQL へ移行
- 02複数の SQL ファイルを一括処理
- 03構文や互換性の問題を調査
MCP 対応
BigQuery Migration Service MCP サーバーのツールを使い、クエリ変換、一括変換、状態確認を行います。変換結果を説明するツールも利用できます。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ google/ skills --skill bigquery-migration-sql-translatorインストール後、Claude Code で/bigquery-migration-sql-translatorを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/python_embedded_sql_migrator_template.pyassets/translation_config_examples/environment_example.yamlexperimental_input_formats_example.yamlexperimental_metadata_example.yamlexperimental_object_rewriter_example.yamlexperimental_optimizer_example.yamlexperimental_statement_rewriter_example.yamlinput_formats_example.yamlmetadata_example.yamlobject_rewriter_example.yamloptimizer_example.yamlstatement_rewriter_example.yamlassets/translation_config_schemas/environment.jsonexperimental_input_formats.jsonexperimental_metadata.jsonexperimental_object_rewriter.jsonexperimental_optimizer.jsonexperimental_statement_rewriter.jsoninput_formats.jsonmetadata.jsonobject_rewriter.jsonoptimizer.jsonstatement_rewriter.jsontranspiler_config_spec.jsonreferences/effect_compatibility.mdeffect_completeness.mdeffect_correctness.mdmcp_config.mdoracle_gotchas.mdsnowflake_gotchas.md詳細
BigQuery Migration Service(BQMS)SQL トランスレーター
BigQuery Migration Service(BQMS)は、レガシーデータベースの SQL スクリプト、 クエリ、スキーマを GoogleSQL に変換します。このスキルでは、変換 ワークフロー、Cloud Storage へのステージング、コンパイラーエラーのトリアージ、YAML 設定を調整します。
始める前に
クエリやスキーマを変換する前に、以下の前提条件を確認してください。
-
Google Cloud SDK とプロジェクトの設定:Google Cloud SDK がインストールされていることを確認し、 Google Cloud プロジェクトに有効な Cloud Billing アカウントが関連付けられていることを確認してから、対象プロジェクトを選択します。
gcloud config set project {project_id} -
API の有効化:Google Cloud プロジェクトで BigQuery Migration API (
bigquerymigration.googleapis.com)を有効にします。gcloud services enable bigquerymigration.googleapis.com -
必要な IAM ロール:ユーザーまたはサービスアカウントに以下のロールが付与されていることを確認します。
roles/mcp.toolUser(MCP ツールユーザー)roles/bigquerymigration.editor(Migration Workflow Editor)- バッチ変換の場合、入力ファイルと出力ファイルを保存する Cloud Storage バケットで
roles/storage.objectViewerとroles/storage.objectCreator(またはroles/storage.objectAdmin)。
-
MCP サーバーへの接続:BigQuery Migration Service(BQMS)ツール(例:
translate_query、translate_batch_queries)が有効なツール一覧にない場合は、リモート BigQuery Migration Service(BQMS)MCP サーバーを設定します。各クライアント(Claude、Cursor、Gemini CLI、 VS Code)でのセットアップ手順については、mcp_config.md を参照してください。 -
費用と Cloud Storage のクリーンアップ:Cloud Storage と BigQuery の利用状況について、 Google Cloud の料金を確認してください。バッチ移行が完了したら、Cloud Storage 内の一時的なステージング済み入力フォルダーと出力フォルダーを削除します。
gcloud storage rm -r gs://{bucket}/{folder} -
変換の追跡:バッチ変換や、複数回の変換が必要なクエリでは、目標、予定している手順、進捗を記録する変換トラッカー(例:
translation_tracker.md)を用意します。 変換のたびに、以下のテンプレートを使って 1 行を記録してください。イテレーション ステータス エラーの合計 正確性エラー 完全性エラー 互換性エラー 主な対応/変換 1 回目の試行で問題なく変換できた単一のクエリには、トラッカーは不要です。回答には変換 ID とログを記載してください。
ワークフローの選択
移行の範囲に応じてワークフローを選択します。
- インタラクティブ変換(単一クエリ):アドホックなクエリ、探索的テスト、方言構文の比較、または迅速なエラーデバッグに最適です。
- バッチ変換(複数ファイルと Cloud Storage):複数のファイルやディレクトリを変換する場合に使用します。アプリケーションコードに埋め込まれた SQL も対象です(最初に
.sqlファイルへ抽出してください)。SQL を埋め込んだ複数ファイルの Python コードベースでは、 python_embedded_sql_migrator_template.py を使用してクエリをステージング済みファイルに抽出し、変換後の SQL を再度挿入します。バッチ変換は、ファイルを 1 つずつ変換するより高速かつ低コストで、ファイル間の依存関係も解決するため、通常はより良い結果が得られます。最初にステージング済みファイルに対してtranslate_batch_queriesを実行し、必要な場合に限り、その後translation_report.csvの特定のステートメントをデバッグするためにtranslate_queryを使用します。
1. インタラクティブ変換ワークフロー
インタラクティブワークフローを使用すると、単一のクエリ文字列を変換してコンパイラーログを確認し、問題を反復的に解決できます。
手順
-
クエリを送信する(
translate_query):projectNumber、location、inputQuery、sourceDialect、およびtargetDialect(BigQuery)を指定してtranslate_queryを呼び出します。次の省略可能なパラメーターも指定できます。metadataFilePath:スキーマ解決に使用するメタデータの zip ファイルの Cloud Storage URI (gs://.../metadata.zip)。translationConfigs:インラインの YAML 設定(オブジェクト名の変更、スキーマのリダイレクト、 オプティマイザールールなど)。ユーザーが再利用できるよう、使用した YAML を回答に含めてください (バッチ翻訳での使用など)。
-
ステータスをポーリングする(
get_translation):返されたtranslation_stateがRUNNINGまたはPENDINGの場合、translationID、projectNumber、locationを使用してget_translationをポーリングし、translation.stateがSUCCEEDEDまたはFAILEDになるまで続けます。 ポーリング間隔は、BigQuery Migration Service(BQMS)の MCP ツールの説明に記載されています。ジョブの実行中は、 結果を必要としない作業(方言固有の注意点のリファレンスを読むなど)を行います。 -
出力とログを確認する:
translated_queryを確認し、変換された GoogleSQL を調べます。translation_logsの各項目を確認します。severity(ERROR、WARNING)、category(例:RelationNotFound)、effect(CORRECTNESS、COMPLETENESS、COMPATIBILITY)を調べます。- ログだけでなく SQL 自体も確認します。BigQuery Migration Service
(BQMS)は、マッピングできない型を
ERROR_TYPE(...)として出力することがありますが、 ログ項目がない場合もあります。ERROR_TYPEまたはインラインのエラーコメントはエラーとして扱い、 BigQuery プロジェクトが利用できる場合は、結果をドライランします(bq query --dry_run --use_legacy_sql=false)。Not foundまたはmust be qualified with a datasetエラーが発生しても、SQL の構文が有効であることに変わりはありません。 参照先のオブジェクトがまだ BigQuery に存在しないだけです。その旨を伝えて先に進みます。 エラーに修正案が示されていても、テーブルを仮作成したり、SQL やbqのフラグを変更したりして エラーを回避しないでください。 NoSuchFunctionエラーは、BigQuery Migration Service(BQMS)がその呼び出しを変更せずにコピーしたことを 意味します。関数名がバッククォートで囲まれている場合もあります。BigQuery に同じ名前の関数があっても、 未変換として扱います。テーブル不足でドライランが停止した場合、その関数はチェックされません。- ソース方言に注意点のリファレンスがある場合は( 方言固有の注意点を参照)、それを読み、記載されているパターンが出力に ないか確認します。意味上の違いによってはログ項目が出ず、ドライランにも合格することがあります。
-
問題がなくなるまで繰り返す:ログにエラーや警告が含まれている場合、変換後の SQL に
ERROR_TYPEまたは インラインのエラーコメントが含まれている場合、ドライランが失敗した場合、または出力が方言固有の注意点に 該当する場合は、変換の問題を解決するに記載された方法で問題を解決し、 再度変換します。 -
違いを説明して比較する(
explain_translation):変換の説明、構文の違いの比較、または特定のクエリロジックが どのように変換されたかの確認を求められた場合は、translation(変換 ID)、projectNumber、およびlocationを指定してexplain_translationを呼び出します。この呼び出しでは、クエリの目的に関する構造化された説明と、 ソースクエリと変換後の GoogleSQL の構文、関数、動作の違いについての詳細な内訳が返されます。 この説明では出力の検証は行われないため、説明だけに頼らず、ステップ 3 に従って変換結果を確認してください。
2. バッチ翻訳のワークフロー
バッチ翻訳では、Cloud Storage にステージングされた複数のファイルを処理します。ファイル間の依存関係を解決し、
統合された翻訳概要レポート(translation_report.csv)を生成します。
手順
-
入力ファイルをクラウドストレージにステージングする:ローカルの ワークスペースにある未加工の SQL ファイル、設定ファイル(
*.config.yaml)、 およびメタデータファイルを、Cloud Storage の入力フォルダーにアップロードします。gcloud storage cp input/*.sql gs://my-bucket/migration/input/ gcloud storage cp *.config.yaml gs://my-bucket/migration/input/注:設定ファイルがすでに
sourceBaseUri内にある場合は、ツールの パラメーターで設定ファイルのパスを指定しないでください。実行ごとに、新しい空の Cloud Storage 入力フォルダーと出力フォルダーを使用します (例:タイムスタンプを付加します)。ステージングするのは、ローカルの ワークスペースにあるファイル、または今回の実行で生成されたファイルだけです。 以前の実行でバケットに保存された入力、DDL、出力は、異なる入力や設定から 生成された可能性があるため、再利用したりコピーしたりしないでください。
-
バッチ変換を開始する:
- SQL クエリの変換(
translate_batch_queries):projectNumber、location、sourceDialect、targetDialect、sourceBaseUri、およびtargetBaseUriを指定して、translate_batch_queriesを呼び出します。 - メタデータ ZIP ファイルの変換(
translate_metadata):抽出した データベースメタデータ ZIP ファイル(Teradata、Oracle などのmetadata.zip)から移行先の BigQuery DDL スキーマ定義を生成して バッチ変換を支援するには、sourceBaseUri(metadata.zipの Cloud Storage URI)とtargetBaseUri(出力先の Cloud Storage フォルダー)を指定してtranslate_metadataを呼び出します。
- SQL クエリの変換(
-
完了をポーリングする(
fetch_batch_translation):返されたワークフロー ID を 使用して、translation.stateがSUCCEEDEDまたはFAILEDになるまで、 BigQuery Migration Service(BQMS)MCP ツールの説明に記載された間隔で ポーリングします。 -
出力を取得して確認する:生成されたファイルを
translation.target_base_uriからダウンロードします。gcloud storage cp -r gs://my-bucket/migration/output/ ./local_output/report/translation_report.csvを見つけて確認し、すべての警告、エラー、 行単位の診断を確認します。次に、生成された.sqlファイルをスキャンしてERROR_TYPE(...)とインラインエラーコメントを確認します。これらはレポートに 欠落している場合があります。また、BigQuery プロジェクトを利用できる場合は、 生成された SQL をドライランします(対話型ワークフローと同様にNot foundエラーを処理します)。ソース方言の注意点リファレンスがある場合は、 出力にそのパターンがないか確認します。残っている問題はすべて解決するか、 明確に報告してください。この確認が完了するまでは、出力に問題がないと 説明しないでください。 -
問題がなくなるまで繰り返す:手順 4 で見つかった問題を 変換の問題を解決するの説明に従って解決し、 入力を変更したうえで手順 1 から再実行します。
-
後処理(最後の手順のみ):再変換で修正可能なコンパイラーエラーをすべて 解決してから、アプリケーションレベルの後処理(例:AST の再挿入)を実行して ホストソースファイルを復元します。 effect_correctness.mdには、埋め込み SQL の 再挿入後に残る可能性のあるエラーが記載されています。
翻訳に関する問題の解決
どちらのワークフローでも、問題は同じ方法で解決します。
- 各問題の影響(
CORRECTNESS、COMPLETENESS、COMPATIBILITY)を特定し、コンパイラのフェーズ依存関係に従って順番に解決します。まずCORRECTNESS(解析エラー)、次にCOMPLETENESS(オブジェクトの不足)、最後にCOMPATIBILITY(未対応の機能)に対応します。 - 修正を適用する前に、エラーの影響別トラブルシューティングにある各影響のリファレンスガイドを必ず読み、そこに記載された解決ワークフローに従ってください。
- 修正では、入力の前処理(例:DDL の追加)や、BigQuery Migration Service(BQMS)の出力の後処理(例:方言に関する注意点で必要とされる書き換え)を行えます。自分で翻訳するのではなく、前処理した入力に対して BigQuery Migration Service(BQMS)を実行してください。
- 再翻訳する場合は、常にソースシステムの方言を使用してください。同じ SQL を別の方言で受け入れられる場合でも、異なるセマンティクス(例:戻り値の型、数値型、識別子の大文字・小文字)で翻訳される可能性があるため、よりきれいな出力を得る目的で方言を切り替えないでください。
- 最適化など、ユーザーの依頼によるものも含め、BigQuery Migration Service(BQMS)の出力を書き換える場合は、ソースクエリと同じ行を返す必要があります。たとえば、行数制限(
TOP、LIMIT)の後に実行されるフィルターを、行数制限の前に実行されるクエリに統合することはできません。 - 再翻訳が完了するまで待ち、その翻訳 ID、エラー件数、前処理または後処理の内容をトラッカーに記録し、前回の反復時の件数と比較してください。エラーがなくなるか、すべての選択肢を使い切るまで繰り返します。
- トラッカーに記録された反復での最終 SQL、適用した前処理と後処理、残っているエラーを報告してください。
リファレンス検索インデックス
エラーのトラブルシューティングや設定ファイルの作成には、以下のリファレンスガイドを使用してください。
エラーの影響別トラブルシューティング
| 影響 | 主な原因 | リファレンスガイド |
|---|---|---|
CORRECTNESS | 構文エラー、エスケープされていないリテラル、アプリケーションスクリプトのラッパー、NoSuchFunction。 | effect_correctness.md |
COMPLETENESS | テーブル、ビュー、列の不足(RelationNotFound、AttributeNotFound)、DDL の提案。 | effect_completeness.md |
COMPATIBILITY | GoogleSQL に直接対応するマッピングがない関数や機能。 | effect_compatibility.md |
設定とセットアップガイド
| タスク | 説明 | リファレンスガイド |
|---|---|---|
| YAML 設定 | データベース/スキーマのリダイレクト、名前のマッピング、テーブルのパーティション分割とクラスタリングの注入、オプティマイザーによる変換、ステートメントの書き換え、および環境設定です。スキーマは assets/translation_config_schemas/ に、例は assets/translation_config_examples/ にあります。 | translation_yaml_config.md |
| MCP サーバーのセットアップ | リモート BigQuery Migration Service(BQMS)MCP サーバー、OAuth スコープ、および IAM ロールの設定です。 | mcp_config.md |
方言固有の注意点
| 方言 | 主な考慮事項 | リファレンスガイド |
|---|---|---|
| Teradata | SET/MULTISET テーブル、SAMPLE 句、プライマリーインデックスのマッピングです。 | teradata_gotchas.md |
| Oracle | PL/SQL プロシージャ、ROWNUM のエミュレーション、外部結合 (+)、シーケンスです。 | oracle_gotchas.md |
| Snowflake | 動的テンプレート、USE ステートメント、メタデータのマージ、ラテラル結合です。 | snowflake_gotchas.md |