5 Oracle Database Provider for DRDAの管理およびカスタマイズ
管理およびカスタマイズに関する様々な課題について説明します。
5.1 Oracle Database Provider for DRDAを使用した移行ステップ
Oracle Databaseへの既存のDB2アプリケーションの移行はデータおよびターゲットに依存する作業ですが、一般には次の6つのステップで構成されます。
-
Oracle Database Provider for DRDAソフトウェアのインストールおよび構成
-
Oracle DatabaseへのOracle Database Provider for DRDAオブジェクトのインストール
-
DRDAパッケージの権限の管理
-
DB2データの移行
-
アプリケーションのターゲット再設定
-
SQL翻訳およびデータ型の調整
5.2 Oracle Database Provider for DRDAの使用に関する考慮事項
Oracle Database Provider for DRDAソフトウェアをインストールする前に、運用およびリソースに関する複数の事項を組織内で検討する必要があります。スタンドアロンのOracleホーム、既存のデータベース内でのOracleホーム、Oracle Databaseとは完全に切り離されたマシン上のスタンドアロンのOracleホームのいずれが最適なインストール環境であるかを判断する際に最も重要な要素は、マシンとネットワークのリソースの柔軟性とパフォーマンスです。また、このインストール環境を使用する必要があるすべてのDB2クライアントの特性も、決定要因の1つです。この場合、DB2はクライアントとみなされます。
5.3 Oracle Database Provider for DRDAのインストールの前提条件
Oracle DatabaseにOracle Database Provider DRDAオブジェクトをインストールする前に、1人以上のユーザーをDRDA管理者とし、管理者ロールを付与する必要があります。
同様に、Oracle Database Provider for DRDAまたはDB2アプリケーションからOracle Databaseにアクセスするユーザーを指定し、DRDAユーザーの役割と権限を付与します。DRDAユーザーの権限と構成の設定の一部は、移行プロセスの後半まで遅らせる必要があります。そのほとんどは、アプリケーションで使用される特定のDRDAパッケージ、および特定のSQL翻訳またはデータ型の調整に関連しています。移行前にアプリケーションのパッケージが特定されている場合は、パッケージ認可ワークフローにおいてそれらを適用できます。
5.4 DRDAパッケージの権限の管理
DRDAまたはDB2アプリケーションからOracle Database Provider for DRDAを介してOracle Databaseへアクセスできるようにするには、パッケージ認可が適用されている必要があります。最小限でもアプリケーションとそのユーザーに関する次の情報を収集する必要があります。
-
パッケージ・コレクションID (
NULLID
など) -
パッケージ名(
DSNPBD3
など) -
パッケージのバージョン名(存在する場合) (
01
またはNULL
など) -
データベースにアクセスする必要があるOracleユーザーの名前 (
DRDAUSR
など)
パッケージが表すアプリケーションのSQL翻訳プロファイル名も指定する必要があります。
5.5 DB2データの移行
DB2ではオブジェクトを任意のスキーマに作成できますが、Oracle Databaseではスキーマ名は任意ではありません。したがってDB2からOracleにデータを移行する際にはスキーマを慎重に使用することを考慮する必要があります。Oracleでは、表、ビュー、シノニムなどのすべてのスキーマ・オブジェクトを実際のユーザーのスキーマに割り当てる必要があります。当然これは、これらのオブジェクトの名前の指定、作成およびアクセス方法に影響します。
たとえば、USER1
が表"USER1"."TABLE1"
および"USER2"."TABLE2"
を作成するとします。DB2ではTABLE1
およびTABLE2
はUSER1
によって作成されるため、USER1
がこれらの表を所有します。Oracleでは表"USER2"."TABLE2"
の所有者はユーザーUSER2
です。また、USER1
にCREATE ANY TABLE
権限が付与されていない場合には、USER1
はTABLE2
を作成できません。かわりに、USER2
がTABLE2
を作成し、この表へのアクセス権限をUSER1
に付与する必要があります。
また、DB2からOracleに移行されるデータは、Oracleデータ型に基づいて定義されている必要があります。OracleではANSI定義のデータ型名が使用されていますが、その範囲制限またはセマンティクスはDB2実装と必ずしも同一ではありません。既存のDB2アプリケーションのデータ型を正確にモデル化するには、「Oracle Database Provider for DRDAのデータ・ディクショナリ」の項を参照してください。
適切なデータ型を使用してスキーマとオブジェクトを作成した後で、データをOracleにインポートできます。
5.6 Oracle Databaseを使用するためのアプリケーションのターゲット再設定
次の例は、DB2 z/OSアプリケーションを移行する方法を示しています。DB2/LUWまたはDB2/400アプリケーションを移行するときにも同様のステップを実行する必要があります。各製品の同等のステップの詳細は、IBMドキュメントを参照してください。
ノート:
この例は、DB2 for z/OSにのみ適用されます。アプリケーションは、ネイティブ・アプリケーションおよびリモート・アプリケーションという2種類の一般的なカテゴリに分類されます。
5.6.1 ネイティブ・アプリケーションのターゲット再設定
標準的なDB2アプリケーションはネイティブと呼ばれます。これは、このようなアプリケーションは内部IPCメカニズムを介してローカルDB2システムと直接連携するためです。これらのアプリケーションは、埋込みSQLプログラミングとDB2 SQLプリプロセッサを使用します。ソースの事前処理の結果生成される実行計画は、Database Resource Module (DBRM)に格納されます。プログラムの実行前に、ユーザーが実行計画をアップロードし、ローカルDB2インスタンスにバインドする必要があります。
実行計画には、アプリケーション・ソースに埋め込まれているすべての静的SQLおよびlocation (Current Serverとも呼ばれる)などの追加属性が含まれています。デフォルトでは、Current Serverは空白であり、サーバーがローカルDB2インスタンス上にあることを示します。ただし、すべての操作を別のサーバーで実行するように実行計画のターゲットを再設定できます。このためにはCurrent Server属性に新しい値を設定します。
次のステップは、IBM DB管理者が実行する必要があります。
5.7 SQL文の翻訳およびデータ型の入力
アプリケーションによっては、SQL翻訳の自動翻訳メカニズムでは処理できないDB2固有のSQLが含まれている場合や、問合せで特定の列に非常に特殊なデータ型が必要となる場合があります。このような場合には、代替のSQL文を手動で挿入するか、アイテム固有のデータ型操作を追加する必要があります。
たとえば、アプリケーションの特定のSQL文の構文が、DB2固有の構文(SELECT LOG2(COL1) FROM TABLE1
)であるとします。Oracleで正しく動作するためには、このSQLをSELECT LOG10(COL1,2) FROM TABLE1
文に翻訳する必要があります。
SQL翻訳の登録機能により、このSQL文に対する直接的な翻訳を登録できます。これについては「代替のSQL文の登録」で説明します。これは、SQL文を実行するユーザーが実行する必要があること、そのユーザーのリソースとしてSQL翻訳プロファイルを作成する必要があることに注意してください。
SQLトランスレータの登録後に、アプリケーションにより元のSQLが発行されると、新しいSQLおよびプロセスに暗黙に翻訳されます。
ごくまれに、アプリケーション・クライアントで、問合せのSELECTの項目のデータ型が非常に特殊な形式で戻されなければならないことがあります。
たとえば、翻訳後の問合せSELECT LOG10(COL1,2) FROM TABLE1
の結果としてDECFLOAT34
データ型が戻されるが、アプリケーションがこのデータ型を処理できず、このデータ型を別の互換性のある型に暗黙かつ強制的に変換する可能性があります。
アプリケーションでDOUBLE PRECISION
データ型がサポートされている場合、TYPEMAP
機能を使用して、この強制的な変換を追加できます。詳細は、「オンデマンド・データ型変換の登録」を参照してください。
5.7.1 代替のSQL文の登録
例 5-1 代替のSQL文の登録
アプリケーションのパッケージにはプロファイル名DB2ZOS
が割り当てられています。
connect DRDAUSER/userpwd
execute dbms_sql_translator.register_sql_translation('DB2ZOS',
'SELECT LOG2(COL1) FROM TABLE1',
'SELECT LOG10(COL1,2) FROM TABLE1')