Oracle から Azure Database for PostgreSQL フレキシブル サーバーへのスキーマ変換における制限事項

この記事では、Oracle を使用して、Visual Studio Codeのスキーマ変換機能をAzure Database for PostgreSQLする場合の既知の制限事項、サポートされていないオブジェクト、および移行に関する考慮事項をまとめています。

プラットフォームサポートの制限事項

  • ARM64: Windowsまたは Linux ではサポートされていません。

サポートされていないオブジェクトと部分的にサポートされているオブジェクト

次のセクションでは、ツールが変換しない Oracle オブジェクト、または処理する必要がある動作の違いを使用して変換する Oracle オブジェクトの一覧を示します。 正常に変換されるオブジェクトは、ここには一覧表示されません。

これらの表では、各オブジェクト クラスの一般的な結果について説明します。 個々のオブジェクトは、変換されないコンストラクト (Java ルーチンを呼び出す関数など) を使用する場合でも注意が必要になる可能性があるため、独自の変換実行からのオブジェクトごとのレポートはスキーマに対して権限を持ちます。

Oracle システムと組み込みスキーマは抽出または変換されません。 これには、 SYSSYSTEMXDBMDSYSCTXSYSWMSYSなどのスキーマが含まれます。

Note

ツールが抽出しても完全に変換できないオブジェクトは、レビュー タスクとしてスキーマ変換レポートに追加されます。 これらのタスクは、手動で、または GitHub Copilot エージェント モードのサポートを使用して解決できます。

プレースホルダーの出力

ツールは、オブジェクトに対して動作する変換を生成できない場合、オブジェクトを削除するのではなく、ベスト エフォートまたはプレースホルダー DDL を出力します。 プレースホルダーは、元の名前と署名を保持して、それに依存するオブジェクトが変換および配置されるようにします。 この方法では、少数の問題オブジェクトがスキーマの残りの部分をブロックするのを防ぎます。

プレースホルダーは機能しません。 スキーマ変換レポートは、展開する前にレビューが必要な場合に、受け取るすべてのオブジェクトにフラグを設定します。 プレースホルダーに依存するオブジェクトは、生成された配置スクリプトから保持することもできます。そのため、変換されていない 1 つのルーチンが他のいくつかのオブジェクトに影響を与える可能性があります。

最も一般的な原因を次に示します。

  • 自律トランザクション。 PRAGMA AUTONOMOUS_TRANSACTIONを使用するルーチンは、最大の 1 つの原因です。 変換によって自律的な作業が dblink経由でルーティングされるため、変換時に dblink がターゲットにインストールされていない場合、これらのルーチンはプレースホルダー出力にフォールバックします。 本体が単純な INSERT ではなく、 COMMITが続くルーチン、または例外ハンドラーまたは MERGE ステートメントを含むルーチンも、手動で確認する必要があります。
  • ツールが解決できなかった参照。 ツールが変換しなかった別のオブジェクトを参照するオブジェクト、または別の作業単位で変換されたオブジェクトは、コンパイル検証できません。
  • トランザクション制御ステートメント。 ROLLBACK TO SAVEPOINTなどのコンストラクトは、常に正常に変換されるわけではありません。
  • ラップされた PL/SQL。 これらは常にプレースホルダーを生成します。 詳細については、 ラップされた PL/SQL を参照してください。

プログラミング可能なオブジェクト

オブジェクトの種類 制限事項 何をすべきか
パッケージ本文 パッケージの状態は PostgreSQL セッション変数にマップされるため、呼び出し間で保持される状態は Oracle パッケージ インスタンスと同じように動作しません。 アプリケーションが想定どおりに共有状態が動作することをテストします。
使用するルーチン PRAGMA AUTONOMOUS_TRANSACTION 自律的な作業は dblinkを介して個別の接続で実行されるため、呼び出し元とは独立してコミットされ、呼び出し元が失敗した場合はロールバックされません。 いくつかのボディシェイプには手動レビューが必要です。 変換する前に dblink をインストールしてから、各ルーチンを確認して、この違いが許容されることを確認します。
トリガー (システム イベント) このツールは、 LOGONLOGOFF のみをシステム イベントのサブタイプとして認識します。 STARTUPSHUTDOWN、および SERVERERROR トリガーはシステム イベント トリガーとして分類されないため、変換に渡して PostgreSQL で動作しない出力を生成できます。 これらのトリガーのソースを確認し、データベースの外部でロジックを再実装します。
トリガー (クロスエディション) エディションベースの再定義が検出されません。 クロスエディション トリガーは通常のトリガーに変換されるため、エディションをまたがるデータ操作に対してのみではなく、すべてのセッションに対して起動されます。 単一エディションを変換し、リリース プロセスでバージョンのロールアウトを処理します。
型本体 抽出されません。 PostgreSQL 関数としてオブジェクト型メソッドを再実装します。
ソース、Java ストアド プロシージャ、Java クラスをJavaする 抽出されません。 フレキシブル サーバー Azure Database for PostgreSQLデータベースでJavaを実行できません。 PL/pgSQL でロジックを書き換えるか、アプリケーション レイヤーに移動します。
外部 C ライブラリ (CREATE LIBRARY) 抽出されません。 PL/pgSQL でロジックを書き換えるか、アプリケーション レイヤーに移動します。
wrap された PL/SQL 本文を読み取ることができないため、プレースホルダーのみが生成されます。 詳細については、 ラップされた PL/SQL を参照してください。 元のラップされていないソースを指定し、もう一度変換します。

wrap された PL/SQL

このツールは、Oracle wrap ユーティリティまたは DBMS_DDL.WRAP を使用して、ラップされた (難読化された) 形式で格納されている PL/SQL ユニットのソースを読み取ることはできません。 このツールは、これらのユニットを検出し、Oracle データ ディクショナリから署名メタデータを読み取り、同じ名前とシグネチャを持つ PostgreSQL ルーチンと、呼び出されたときにエラーを発生させる本文を生成します。

このプレースホルダーを使用すると、ラップされたユニットに依存するオブジェクトを変換してデプロイできます。 生成されたルーチンにはロジックが含まれず、スキーマ変換レポートには、ラップされたすべてのオブジェクトがレビュー タスクとして一覧表示されます。このタスクは、公開前に解決する必要があります。

ラップされたユニットを正しく変換するには、元のラップされていないソースを指定し、変換を再度実行します。

データ オブジェクトとストレージ オブジェクト

オブジェクトの種類 制限事項 何をすべきか
ユーザー定義演算子 (CREATE OPERATOR) 変換は保証されず、プレースホルダー出力を生成できます。 生成された演算子を確認し、テストします。
インデックス (ビットマップ、ビットマップ結合、グローバル パーティション分割、またはドメイン) 抽出されません。 PostgreSQL では、Oracle ビットマップまたはドメイン インデックスは使用されません。 通常、機能アクションはありません。 ターゲットのパフォーマンスに依存するクエリを調整します。
具体化されたビュー ログ (MLOG$) 抽出されません。 何もしない。 これらは、PostgreSQL に必要のない Oracle 更新サポート オブジェクトです。
外部テーブル 抽出されません。 フレキシブル サーバー Azure Database for PostgreSQLサーバー ファイルシステムにアクセスできないため、file_fdwは使用できません。 クライアント側の \copy または COPY ... FROM STDINazure_storage 拡張子、またはアプリケーションを使用して、テーブルにファイルを読み込みます。
Advanced Queuing (AQ) テーブル 抽出されません。 Oracle Advanced Queuing には、アプリケーション ロジックが含まれています。 アプリケーション キュー、PostgreSQL 拡張機能、またはAzure メッセージング サービスを使用して再設計します。
ブロックチェーン テーブル 抽出されません。 アプリケーション層の整合性要件を再実装します。
クラスターとハッシュ クラスター 抽出されません。 プレーン テーブルまたはパーティション テーブルとして再作成します。
ディレクトリ オブジェクト (CREATE DIRECTORY) 抽出されません。 アプリケーション層のファイル アクセスを処理します。
ユーザー定義インデックスの種類 (CREATE INDEXTYPE) 抽出されません。 PostgreSQL 拡張機能インデックスが存在するアクセス方法を再作成します。
データベース リンク 変換されません。 詳細については、「 データベースリンク」を参照してください。 外部データ ラッパーを使用して再作成します。
アプリケーション コンテキスト (CREATE CONTEXTDBMS_SESSION.SET_CONTEXT) 抽出されません。 コンテキストを PostgreSQL セッション設定にマップし、 current_setting()で読み取ります。
分析ビュー、属性ディメンション、階層、OLAP ディメンション、データ マイニング モデル、具体化されたゾーン マップ 抽出されません。 これらは PostgreSQL ターゲットを持っていません。 必要な出力をビューまたは関数として再構築するか、削除します。
LOB ストレージ句、登録済み XML スキーマ (DBMS_XMLSCHEMA.REGISTERSCHEMA)、および XML スキーマ バインド インデックス 抽出されません。 ターゲットのストレージまたは検証の要件をリフォームします。
Resource Managerプランとコンシューマー グループ、SQL プロファイル、SQL プラン ベースライン、エディション、SQL 翻訳プロファイル、情報ライフサイクル管理ポリシー、ロックダウン プロファイル、ワークスペース マネージャー オブジェクト 抽出されません。 これらは、スコープ外の Oracle インスタンス、オプティマイザー、またはライフサイクル成果物です。 アプリケーションまたはインフラストラクチャ レイヤーで再作成するか、Azure Database for PostgreSQLにドロップします。

このツールは、プライベート データベース リンクとパブリック データベース リンク (CREATE DATABASE LINKCREATE PUBLIC DATABASE LINK) を自動的に変換しません。 データベース リンクには、PostgreSQL に直接変換されない資格情報とリモート エンドポイント情報が格納されます。

postgres_fdworacle_fdwなどの PostgreSQL 外部データ ラッパーを使用してターゲット上でこれらのリンクを再作成するか、アプリケーション レベルの接続にリファクターします。 Oracle ソースで @link 参照を検索し、シノニムとビュー内の参照を含むすべての依存関係を見つけられるようにします。

セキュリティ オブジェクトと ID オブジェクト

ユーザー、ロール、特権、およびデータ保護ポリシーは、変換の最大のギャップです。 このツールは、周囲のセキュリティ 層ではなく、スキーマ オブジェクトを変換します。 この領域は別の手動ワークストリームとして扱い、スキーマ変換レポートではなく Oracle ソース インベントリから計画します。

オブジェクトの種類 制限事項 何をすべきか
User 抽出されません。 Azureでログインを個別にプロビジョニングします。 各ユーザーを PostgreSQL ロールとして再作成し、公開する前に結果のアクセス権を検証します。
Role 抽出されません。 ターゲットの各ロールを再作成します。
システム特権 抽出されません。 PostgreSQL GRANT ステートメントとして再作成します。
ロールのメンバーシップ 抽出されません。 GRANT <role> TO <role>ステートメントとして再作成します。
オブジェクト権限と付与 許可の抽出は既定でオフになり、オブジェクト許可のみが対象となります。 ソース インベントリから許可を再作成し、検証します。
行レベルのセキュリティと仮想プライベート データベース (DBMS_RLS) 変換されません。 PostgreSQL 行レベルのセキュリティ ポリシーとしてポリシーを再作成します。
Oracle ラベルのセキュリティ 変換されません。 ターゲットのデータ アクセス境界を再設計します。
データの編集 (DBMS_REDACT) 変換されません。 ターゲット、アプリケーション レイヤー、または PostgreSQL と同等のマスクを再適用します。
プロファイル、パスワード ポリシー、統合またはきめ細かい監査ポリシー (DBMS_FGAAUDIT POLICY) 抽出されません。 同等のAzureサーバー パラメーターと監査を構成し、それらをコードとしてのインフラストラクチャとして管理します。

Important

このツールは、行レベルのセキュリティ、仮想プライベート データベース、Oracle ラベル セキュリティ、およびデータ編集ポリシーを引き継ぐことはありません。 変換されたスキーマでは、データがデプロイされて返されるため、Oracle でフィルター処理された行が表示され、Oracle によってマスクされた列がクリア テキストで返されます。 運用環境のトラフィックをターゲットにルーティングする前に、これらのポリシーを再作成して確認します。

Scheduler オブジェクト

このツールでは、Oracle スケジューラのメタデータが動作する PostgreSQL スケジュールに変換されません。

オブジェクトの種類 制限事項 何をすべきか
DBMS_SCHEDULER ジョブとスケジュール 変換されません。 pg_cronを使用してターゲットのスケジュールを再作成するか、Azure Logic AppsやAzure Functionsなどの外部スケジューラを使用します。
レガシ DBMS_JOB ジョブ 検出されません。 pg_cronまたはアプリケーション スケジューラを使用してスケジュールを再作成します。
プログラム、チェーン、資格情報、ファイル 監視、ジョブ クラス、グループ、ウィンドウ、およびイベント ベースのジョブ 変換されません。 外部スケジューラでオーケストレーションをリビルドします。

機能レベルのギャップ

オブジェクト型ではなく Oracle の機能を次に示します。 ツールはこれらの機能を検出したり、元の動作の一部を失う方法で変換したりしないため、レビュー タスクとして常に表示されるとは限りません。

特徴 制限事項 何をすべきか
ハイブリッド パーティション テーブル (Oracle 19.3 以降) 通常のテーブルとして変換され、外部パーティションは失われます。 ソース内のハイブリッド パーティション テーブルを特定し、外部データを個別に読み込みます。
エディション ビューとクロスエディション トリガー エディションベースの再定義が検出されません。 エディション ビューは、プレーン ビューとして変換されます。 1 つのエディションを変換し、バージョンのロールアウトを手動で処理します。
不変テーブル (Oracle 19.11 以降) 検出されず、PostgreSQL に相当するものはありません。 アプリケーション レイヤーまたはトリガーで要件を適用します。
フラッシュバック データ アーカイブ テンポラル履歴はモデル化されていません。 ターゲットで履歴テーブル パターンまたはテンポラル拡張を使用します。
フラッシュバック クエリ (AS OF TIMESTAMPAS OF SCN) 変換されません。 行の履歴バージョンを読み取るクエリを書き換える。
Oracle シャーディング モデル化されておらず、単一データベース PostgreSQL に相当するものはありません。 分散戦略を再設計します。
BFILE および SecureFile LOB の詳細 エキゾチックな型に関する一般的なメモとしてのみ処理されます。 各列のストレージとアクセス パターンを確認します。

ID 列、仮想列と生成列、非表示列、グローバル一時テーブルはコンバーターによって処理され、制限はありません。 プライベート一時テーブルは実行時にのみ存在するため、ソース インベントリには表示されません。

ヘルプを取得する

制限が発生した場合:

  1. GitHub Copilot エージェント モードを使用して、レビュー タスクに関するガイド付きサポートを行います。
  2. 代替実装については、PostgreSQL のドキュメントを参照してください。
  3. Oracle から Azure Database for PostgreSQL への移行パターンに関するベスト プラクティスを確認する
  4. 運用環境にデプロイする前に、スクラッチ環境でテストします。