この章では、異機種間サービス(HS)エージェントの使用方法について説明します。エージェントのインストールおよび構成については、Oracle Database Gatewayのインストレーションおよび構成ガイドを参照してください。この章の構成は、次のとおりです。
初期化パラメータを使用してゲートウェイを構成します。そのためには、初期化ファイルを作成し、このファイル内で必要なパラメータを設定します。構成の詳細は、2.5項を参照してください。
異機種間サービスの初期化パラメータは、Oracle Databaseの初期化パラメータとは異なります。異機種間サービスの初期化パラメータは、Oracleデータベースの初期化パラメータ・ファイル(init.ora
ファイル)ではなく、異機種間サービスの初期化ファイル内で設定します。ゲートウェイ・インスタンスごとに、異機種間サービスの初期化ファイルがあります。
この項では、次の項目について説明します。
初期化パラメータの暗号化
ゲートウェイ初期化パラメータ
初期化パラメータには、IDやパスワードなどの機密情報が含まれている場合があります。初期化パラメータは、プレーン・テキストに格納され、セキュリティ上安全ではありません。異機種間サービスに暗号化機能が追加され、パラメータ値の暗号化が可能になりました。暗号化には、dg4pwd
ユーティリティが使用されます。この機能を使用する場合は、初期化ファイルのパラメータ値を、引用符なしのアスタリスク(*)に設定する必要があります。次に例を示します。
値をこのセキュリティ・マーカーに設定することで、実際の値が関連する暗号化パスワード・ファイルに格納されることをすべての異機種間サービス・エージェントが認識します。このファイルの名前はinit
sid
.pwd
です(sid
はゲートウェイで使用されるOracleシステム識別子です)。このファイルはdg4pwd
ユーティリティによって、初期化ファイルを含む現在のディレクトリに作成されます。ユーティリティを実行すると、パラメータの実際の値を入力するように求められます。この値がユーティリティによって暗号化されてパスワード・ファイルに格納されます。暗号化初期化パラメータは暗黙的にPRIVATE
パラメータとして扱われ、サーバーにアップロードされないことに注意してください。
dg4pwd
ユーティリティは、通常ならプレーン・テキストで初期化パラメータ・ファイルに格納される初期化パラメータを暗号化するために使用されます。このユーティリティは、初期化パラメータ・ファイルを現在のディレクトリに読み込み、値にセキュリティ・マーカーが付いたパラメータを検索します。セキュリティ・マーカーは、引用符なしのアスタリスク(*)です。セキュリティ・マーカーにより、このパラメータの値を暗号化してパスワード・ファイルに格納するように指定されます。次に、この値に設定された初期化パラメータの例を示します。
HS_FDS_CONNECT_INFO = *
最初に、現在のディレクトリにある初期化パラメータ・ファイルを編集して、パラメータの値をセキュリティ・マーカーに設定します。次に、このユーティリティを実行し、コマンドラインでゲートウェイSIDを、また暗号化情報に別の所有者を指定する場合はオプションでユーザーIDも指定します。このユーティリティは、初期化パラメータ・ファイルを読み込み、暗号化する実際の値を入力するよう要求します。コマンドの構文は次のとおりです。
dg4pwd [sid] {userid}
ここで、[
sid
]
はゲートウェイのSID、{
userid
}
は内容を暗号化する際に使用するオプションのユーザーIDです。ユーザーIDが指定されていない場合は、現行のユーザーIDが使用されます。値はこのIDを使用して暗号化されます。値を復号化する場合は、このユーザーとしてエージェントを実行する必要があります。次の例では、ゲートウェイのSIDをSYBASEと想定しています。
dg4pwd SYBASE ORACLE Gateway Password Utility Constructing password file for Gateway SID SYBASE Enter the value for HS_FDS_CONNECT_INFO sybasew
前の例では、初期化パラメータ・ファイルinitSYBASE.ora
が読み取られます。パラメータHS_FDS_CONNECT_INFO
は暗号化が必要であると識別されます。値(sybasew
など)を入力して、[Enter]を押します。暗号化が必要なパラメータがまだある場合は、その値が求められます。暗号化されたデータは初期化ファイルと同じディレクトリに格納されます。暗号化を必要とする初期化パラメータは、Oracle Database Gatewayを使用する前に暗号化しておく必要があります。
ゲートウェイ初期化パラメータは、2つのグループにわけることができます。一方はすべてのゲートウェイに共通する汎用初期化パラメータの集合で、他方は個々のゲートウェイに固有の初期化パラメータの集合です。次に、汎用初期化パラメータの中から、このマニュアルで説明する汎用初期化パラメータのみを示します。
HS_BULK
HS_CALL_NAME
HS_COMMIT_POINT_STRENGTH
HS_DB_DOMAIN
HS_DB_INTERNAL_NAME
HS_DB_NAME
HS_DESCRIBE_CACHE_HWM
HS_FDS_CONNECT_INFO
HS_FDS_DEFAULT_SCHEMA_NAME
HS_FDS_SHAREABLE_NAME
HS_FDS_TRACE_LEVEL
HS_LANGUAGE
HS_LONG_PIECE_TRANSFER_SIZE
HS_NLS_DATE_FORMAT
HS_NLS_DATE_LANGUAGE
HS_NLS_NCHAR
HS_NLS_NUMERIC_CHARACTERS
HS_NLS_TIMESTAMP_FORMAT
HS_NLS_TIMESTAMP_TZ_FORMAT
HS_OPEN_CURSORS
HS_ROWID_CACHE_SIZE
HS_RPC_FETCH_REBLOCKING
HS_RPC_FETCH_SIZE
HS_TIME_ZONE
前述のパラメータの設定時には、PRIVATE
キーワードを使用しないでください。PRIVATE
キーワードを使用すると、パラメータがサーバーにアップロードされず、SQL処理中にエラーが発生する可能性があります。前述のパラメータはいずれも環境での設定は必須ではないため、SET
キーワードを使用する必要はありません。
関連項目: ゲートウェイ固有の初期化パラメータのリストについては、各ゲートウェイのマニュアルを参照してください。 |
アプリケーションで異機種間サービスを使用してOracle以外のシステムからデータをフェッチする場合、データは次の順序で転送されます。
Oracle以外のシステムからエージェント・プロセスへ。
エージェント・プロセスからOracle Databaseへ。
Oracle Databaseからアプリケーションへ。
Oracleでは、図4-1に示すように3つのデータ転送がすべて最適化されます。
この項の内容は次のとおりです。
アプリケーションとOracle Database間のデータ転送は、配列フェッチを使用して最適化できます。配列フェッチの詳細と、データ送信量および各ネットワーク・ラウンドトリップの指定方法は、アプリケーション開発ツールのマニュアルを参照してください。
OracleがOracle以外のシステムからデータを取得する場合、異機種間サービスのHS_RPC_FETCH_SIZE
初期化パラメータにより、エージェントとOracle Database間のフェッチごとに送信されるバイト数が定義されます。エージェントは、次のいずれかが発生するまでOracle以外のシステムからデータをフェッチします。
Oracle Databaseへの送信分として指定のバイト数が累積された場合。
Oracle以外のシステムから結果セットの最終行がフェッチされた場合。
Oracle以外のシステムから取得される行数は、HS_FDS_FETCH_ROWS
初期化パラメータにより決定されます。エージェントでは配列フェッチがサポートされる必要があることに注意してください。エージェント固有のマニュアルを参照し、エージェントで配列フェッチがサポートされることを確認してください。
デフォルトでは、エージェントはシステムへの送信分として十分なデータを取得するまで、Oracle以外のシステムからデータをフェッチします。つまり、Oracle以外のシステムからフェッチされたバイト数がHS_RPC_FETCH_SIZE
初期化パラメータの値以上になるまで、フェッチが続行されます。言い換えると、エージェントはOracle Databaseとの間で、HS_RPC_FETCH_SIZE
初期化パラメータの値により定義されたサイズ単位でデータを再ブロック化します。
Oracle以外のシステムで配列フェッチがサポートされる場合は、配列フェッチによりOracle以外のシステムからフェッチしたデータを、HS_RPC_FETCH_SIZE
初期化パラメータの正確な値に達するまで待たずにOracle Databaseに即時に送信できます。つまり、Oracle以外のシステムからOracle Databaseにデータをストリームし、HS_RPC_FETCH_REBLOCKING
初期化パラメータの値をOFF
に設定して再ブロック化を無効にできます。
たとえば、HS_RPC_FETCH_SIZE
を64 KB、HS_FDS_FETCH_ROWS
を100行に設定するとします。また、各行のサイズが約600バイトであるとすると、100行では約60 KBになります。HS_RPC_FETCH_REBLOCKING
初期化パラメータをON
に設定すると、エージェントはOracle以外のシステムから100行のフェッチを開始します。
エージェントにはデータが60KBしかないため、データはOracle Databaseに送信されません。かわりに、エージェントはOracle以外のシステムから次の100行をフェッチします。これでエージェントにあるデータが120KBになったため、最初の64KBをOracle Databaseに送信できます。
この時点で、エージェントには56 KBのデータが残っています。エージェントはOracle以外のシステムからさらに100行をフェッチした後、次の64KBのデータをOracle Databaseに送信します。HS_RPC_FETCH_REBLOCKING
初期化パラメータをOFF
に設定すると、最初の100行がOracleデータベース・サーバーに即時に送信されます。
DBMS_HS_PARALLEL
PL/SQLパッケージにより、異機種間ターゲット・アクセスのパラレル処理が可能になります。このパッケージは、外部の大規模な表からデータを取得するときにパフォーマンスを改善します。
DBMS_HS_PARALLEL
はCURRENT_USER
の認証IDでコンパイルされます。つまり、実行者の権限を使用します。つまり、このパッケージのすべてのプロシージャは、コール・ユーザーの権限で実行されます。
プロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
登録とは、Oracleによりエージェント情報がデータ・ディクショナリに格納される操作です。エージェントの登録は必須ではありません。エージェントが未登録の場合、Oracleではエージェント情報は、データ・ディクショナリのかわりにメモリーに格納されます。エージェントに関係するセッションが終了すると、この情報は使用できなくなります。
自動登録とは、エージェントが情報をデータ・ディクショナリに自動的にアップロードできるように、データベース管理者が初期化パラメータを設定する操作です。自動登録が実行されるのは、HS_AUTOREGISTER
初期化パラメータがTRUE
(デフォルト)に設定されている場合のみです。
注意: HS_AUTOREGISTER は、init.ora ファイル内で設定するOracle初期化パラメータです。ゲートウェイ初期化ファイル内で設定する異機種間サービスの初期化パラメータではありません。 |
この項の内容は次のとおりです。
異機種間データベース・リンク上での正常動作を保証するため、エージェント自動登録により、リモート・ホスト上のエージェントを記述する異機種間サービス構成データの更新が自動化されます。エージェント自動登録はデフォルトの動作です。エージェント自動登録機能を使用しない場合は、HS_AUTOREGISTER
初期化パラメータをFALSE
に設定してください。
サーバーとエージェントは、どちらも3種類の情報に依存して異機種間サービス接続の操作を構成および制御します。この3セットの情報をまとめてHS構成データと呼びます。
異機種間サービス構成データ | 説明 |
---|---|
異機種間サービス初期化パラメータ | 操作の各種接続固有の詳細を制御します。 |
機能定義 | Oracle以外のデータ・ソースでサポートされるSQL言語機能などの詳細を識別します。 |
データ・ディクショナリ変換 | Oracleデータ・ディクショナリ表およびビューへの参照を、Oracle以外のデータ・ソース固有の等価の表およびビューにマップします。 |
HS構成データは、Oracleデータベース・サーバーのデータ・ディクショナリに格納されます。リモート・エージェントであるために別個に管理される場合があるので、ある状況下ではサーバーとエージェントの間で構成が一致しなくなる可能性があります。次に例を示します。
エージェントが別のコンピュータに新しくインストールされ、サーバーの異機種間サービス・データ・ディクショナリには、そのエージェントの異機種間サービス構成データを表す内容が存在しない場合があります。
サーバーが新しくインストールされ、既存のエージェントとOracle以外のデータ・ストアに関する必要な異機種間サービス構成データが欠落している場合があります。
Oracle以外のインスタンスが旧バージョンから新バージョンにアップグレードされ、異機種間サービス構成データの変更が必要になる場合があります。
リモート・サイトの異機種間サービス・エージェントが新バージョンにアップグレードされるか、パッチが適用され、異機種間サービス構成データの変更が必要になる場合があります。
Oracle以外のサイトのデータベース管理者(DBA)が、異機種間サービス構成データに影響するような方法で、チューニングやテストのためにエージェントの設定を変更する場合があります。
エージェント自動登録により、これらのすべての使用例で異機種間サービスを正常に操作できます。特に、エージェント自動登録により、Oracleデータベース・サーバーと異機種間サービス・エージェント(それぞれがリリース8.0.3以上の場合)の相互運用性が強化されます。この機能の基本的なメカニズムは、異機種間サービス構成データをエージェントからサーバーにアップロードする機能です。
自動登録により、Oracleデータベース・サーバーのデータ・ディクショナリに常駐する異機種間サービス構成データが自動的に更新されます。この更新により、エージェント自動登録のアップロードは、未登録エージェントを最初に使用するときに1回実行すればよいことになります。インスタンス情報は、サーバーのデータ・ディクショナリに格納されるのではなく、接続ごとにアップロードされます。
異機種間サービスのエージェント自動登録機能では、次のタスクを実行できます。
エージェントとOracle以外のデータ・ストアをOracleデータベース・サーバーに対して識別します。
エージェントに対して、エージェントと接続先Oracleサーバーの両方に使用する異機種間サービス初期化パラメータの定義を許可します。
接続の初期化中に、機能定義とデータ・ディクショナリ変換(使用可能な場合)を異機種間サービス・エージェントからアップロードします。
注意: クラス情報は、クラスがサーバーのデータ・ディクショナリで定義されていないときにのみアップロードされます。同様に、インスタンス情報は、インスタンスがサーバーのデータ・ディクショナリで定義されていない場合にのみアップロードされます。 |
エージェント自動登録に必要な情報には、次のエージェント指定名を使用してサーバーのデータ・ディクショナリ内でアクセスします。
FDS_CLASS
FDS_CLASS_VERSION
FDS_CLASS
およびFDS_CLASS_VERSION
は、Oracleまたはサード・パーティ・ベンダーにより、異機種間サービス・エージェントとバージョンごとに個別に定義されます。Oracle異機種間サービスでは、これらの名前が連結されてFDS_CLASS_NAME
となり、サーバーのデータ・ディクショナリ内のクラス情報にアクセスするための主キーとして使用されます。
FDS_CLASS
にはアクセスするOracle以外のデータ・ストアのタイプを指定し、FDS_CLASS_VERSION
にはOracle以外のデータ・ストアとそこに接続するエージェントのバージョン番号を指定する必要があります。エージェントのいずれかのコンポーネントに変更があった場合は、新リリースを一意に識別するようにFDS_CLASS_VERSION
も変更する必要があることに注意してください。
注意: この情報は、各接続の初期化時にアップロードされます。 |
インスタンス固有の情報をサーバーのデータ・ディクショナリに格納できます。インスタンス名FDS_INST_NAME
は、該当のエージェントを管理するデータベース管理者(DBA)により構成されます。DBAによるこの構成の実行方法は、使用中のエージェントに応じて異なります。
Oracleデータベース・サーバーでは、FDS_INST_NAME
を使用して、データ・ディクショナリ内でインスタンス固有の構成情報が参照されます。Oracleでは、その値が次のビューで同じ名前を持つ列の主キーとして使用されます。
FDS_INST_INIT
FDS_INST_CAPS
FDS_INST_DD
FDS_INST_NAME
を使用したサーバーのデータ・ディクショナリへのアクセスでも、FDS_CLASS_NAME
を使用して構成情報の行が一意に識別されます。たとえば、データベースをクラスSybase816からクラスSybase817に移植する場合、両方のデータベースが同時にインスタンス名SCOTT
で動作し、別個の構成情報セットを使用することが可能です。
クラス情報とは異なり、インスタンス情報はサーバーのデータ・ディクショナリに自動登録されません。
インスタンス情報は(存在する場合)常にエージェントによりアップロードされます。ただし、サーバーのデータ・ディクショナリに格納されることはありません。かわりに、その情報はメモリーに保持され、その接続においてのみ有効です。
サーバーのデータ・ディクショナリにインスタンス情報が含まれている場合は、そのインスタンス構成に対応する、データベース管理者が定義した設定の詳細を表します。データ・ディクショナリで定義されているインスタンス情報はクラス情報より優先されます。ただし、データ・ディクショナリで定義されているインスタンス情報よりも、アップロードされたインスタンス情報が優先されます。
Oracleデータベース・サーバーのHS_AUTOREGISTER
初期化パラメータを使用すると、異機種間サービス・エージェントの自動登録を有効化または無効化できます。このパラメータは、エージェントの初期化ファイルではなくOracle初期化パラメータ・ファイル内で指定することに注意してください。たとえば、次のようにパラメータを設定できます。
HS_AUTOREGISTER = TRUE
TRUE
に設定すると、エージェントは、以前に認識されていないエージェント・クラスまたは新規エージェント・バージョンの記述情報を、サーバーのデータ・ディクショナリにアップロードします。
このパラメータにはデフォルト値(TRUE
)を使用することをお薦めします。この設定により、サーバーのデータ・ディクショナリの内容は常に、異機種間サービス接続に使用されるクラス機能とデータ・ディクショナリ変換の定義を確実に正しく表すものになります。
関連項目: このパラメータの詳細は、『Oracle Databaseリファレンス』を参照してください。 |
異機種間サービスとゲートウェイは、SQL文の変換または後処理が必要な場合、そのSQL文を書き換えます。
次の例では、Oracle以外のデータベースでINITCAP
関数がサポートされていないことを前提にしています。たとえば、Oracle以外のデータベースから次の操作を要求するプログラムを考えてみます。次に例を示します。
SELECT "COLUMN_A" FROM "test"@remote_db WHERE "COLUMN_A" = INITCAP("COLUMN_B");
INITCAP
関数は、このOracle以外のデータベースでは認識されないため、Oracleデータベース・サーバーは、リモート・データベースのtest
表からデータをフェッチして、ローカルで結果をフィルタします。ゲートウェイは、SELECT
文を次のように書き換えます。
SELECT "COLUMN_A", "COLUMN_B" FROM "test"@remote_db;
問合せ結果がゲートウェイからOracleに送られ、Oracleデータベース・サーバーによりフィルタされます。
前述の例に示した"COLUMN_B"
に文字リテラルまたはバインド変数が指定されている場合、Oracleサーバーの異機種間サービス・コンポーネントは、INITCAP
関数を適用した後に、SQLコマンドをゲートウェイに送信します。たとえば、次のSQLコマンドが発行される場合を考えてみます。
SELECT "COLUMN_A" FROM "test"@remote_db WHERE "COLUMN_A" = INITCAP('jones');
次のSQLコマンドがゲートウェイに送信されます。
SELECT "COLUMN_A" FROM "test"@remote_db WHERE "COLUMN_A" = 'Jones';
次のUPDATE
要求を考えてみます。
UPDATE "test"@remote_db SET "COLUMN_A" = 'new_value' WHERE "COLUMN_A" = INITCAP("COLUMN_B");
この場合、Oracleデータベース・サーバーとゲートウェイはOracle以外のデータベース側のサポートの欠落を補えないため、エラーが発行されます。
前述の例の"COLUMN_B"
に、文字列リテラルまたはバインド変数が指定されている場合、Oracleサーバーの異機種間サービス・コンポーネントは、INITCAP
関数を適用した後に、SQLコマンドをゲートウェイに送信します。たとえば、次のSQLコマンドが発行される場合を考えてみます。
UPDATE "test"@remote_db SET "COLUMN_A" = 'new_value' WHERE "COLUMN_A" = INITCAP('jones');
次のSQLコマンドがゲートウェイに送信されます。
UPDATE "test"@remote_db SET "COLUMN_A" = 'new_value' WHERE "COLUMN_A" = 'Jones';
以前のリリースでは、Oracle以外のデータベースでINITCAP
関数がサポートされていないため、前述のUPDATE
文でエラーが発生していました。
Oracleデータベースは、同機種環境では常にデータ型チェックおよびデータ型の強制を実行します。たとえば、SELECT * FROM EMP WHERE EMPNO='7934'
は、SELECT * FROM EMPNO WHERE EMPNO=7934
と同じ結果を戻します。異機種環境でも同様に、リモート・マップ文に対して完全なデータ型チェックのサポートがあります。一般的に、SQL文のオペランドは、列、リテラル、バインド変数のいずれであっても、データ型チェックのために内部処理されます。次の例を考えてみます。
SELECT * FROM EMP@LINK WHERE NUMBER_COLUMN='123' SELECT * FROM EMP@LINK WHERE NUMBER_COLUMN=CHAR_COLUMN; SELECT * FROM EMP@LINK WHERE NUMBER_COLUMN=CHAR_BIND_VARIABLE;
ほとんどのOracle以外のデータベースは、データ型の強制をサポートしていないため、前述の文がそのままOracle以外のデータベースに送信された場合は失敗します。Oracleデータベースの異機種間サービス・コンポーネントは、Oracle以外のデータベースに使用可能な文を送る前に、データ型チェックと必要なデータ型の強制を実行します。
データ型チェックは、処理後の文またはリモート・マップ文に対して一環した動作を提供します。次の2つの文を考えてみます。
SELECT * FROM EMP@LINK WHERE TO_CHAR(EMPNO)='7933' + '1';
および
SELECT * FROM EMP@LINK WHERE EMPNO='7933' + '1';
前述のどちらの文も、Oracle以外のデータベースでTO_CHAR
関数がサポートされているかどうかに関係なく、同じ結果および強制が提供されます。ここで、次の文を考えてみます。
SELECT * FROM EMP@LINK WHERE EMPNO='123abc' + '1';
データ型チェックが実施されているため、Oracle内で強制が試行されるとエラーが発生し、Oracle以外のデータベースに文が送られることなくエラーが戻されます。
つまり、処理後の文であるかリモート・マップ文であるかに関係なく、データ型チェックおよび強制の動作は一貫しています。
Oracle以外のリモート・データベースでユーザー定義関数を実行できます。次に例を示します。
SELECT getdeptforemp@Remote_DB(7782) FROM dual;
この例では、リモート・データベース内でユーザー定義関数が実行され、従業員7782に関する部門情報を戻すSELECT
文が発行されています。
リモート関数がOracleデータベース内にある場合、Oracleデータベースでは、リモート関数によりデータベースの状態(データベースの行やPL/SQLパッケージの状態など)が更新されないことが自動的に確認されます。リモート関数がOracle以外のデータベースに常駐している場合、ゲートウェイではこのことを確認できません。したがって、ユーザーは、どのデータベースにおいてもユーザー定義関数により状態が更新されないように確認する必要があります。この確認が必要となるのは、読取り一貫性を保証するためです。
セキュリティ対策として、リモートで実行する関数とその所有者を、ゲートウェイ固有の初期化パラメータ・ファイルのHS_CALL_NAME
パラメータで指定する必要があります。次に例を示します。
HS_CALL_NAME = "owner1.A1, owner2.A2 "
owner1
とowner2
は、リモート関数の所有者名です。A1
とA2
は、リモート関数名です。リモート関数の所有者をSQL文で指定する必要はありません。リモート関数は、デフォルトでDatabase Gatewayの接続先スキーマに常駐する必要があります。他の場所に常駐する場合は、リモート関数の所有者をSQL文で指定してください。
ユーザー定義のリモート関数のその他の実行例を次に示します。
副問合せ内のリモート関数
次の関数は、employee_id
列のデータを使用して、リモート・データベースのEMPLOYEES
表からdepartment_id
を取得します。外部問合せにより、戻されたリストと一致するリモート・データベース内の部門番号がすべて判別されます。
SELECT * FROM departments@remotedb WHERE department_id IN (SELECT getdeptforemp@remotedb (employee_id) FROM employees@remotedb);
ユーザー定義リモート関数の結果に対するローカル関数の適用
次の問合せでは、リモート・データベース上の全従業員の最大給与が戻されます。
SELECT max (getsalforemp@remotedb (employee_id)) FROM employees@remotedb;
DML文
次の文では、リモート・データベース内のユーザー定義問合せからの出力を使用して、salary列が新規給与情報で更新されます。
UPDDATE employee_history SET salary = emp_changed_salary@remote_db;
前述の例では、OracleデータベースはDatabase Gatewayに関数名と所有者を渡します。ユーザー定義関数はリモート・データベース上で実行されます。
Oracle Databaseのシノニム機能を使用することで、データの場所の透過性とネットワークの透過性を完全に実現できます。シノニムを定義すると、ユーザーは、基礎となる表またはネットワーク・プロトコルを認識する必要がなくなります。シノニムは、すべてのOracleユーザーが参照できるようにパブリックとして指定できます。また、シノニムをプライベートとして指定することもできます。この場合、すべてのOracleユーザーがOracle以外の表にアクセスするためにシノニムを定義する必要があります。
次の文では、SybaseデータベースのユーザーORACLE
のスキーマ内で、emp
表に対してシステム単位のシノニムが作成されます。
CREATE PUBLIC SYNONYM emp FOR "ORACLE"."EMP"@SYBS;
関連項目: シノニムの詳細は、『Oracle Database管理者ガイド』を参照してください。 |
注意: これらの例を環境にあわせて変更してください。そのままの状態では実行しないでください。 |
次の文では、Oracleデータベース・サーバー、IBM DB2データベースおよびSybaseデータベース間でデータが結合されます。
SELECT O.CUSTNAME, P.PROJNO, E.ENAME, SUM(E.RATE*P."HOURS") FROM ORDERS@DB2 O, EMP@ORACLE9 E, "PROJECTS"@SYBS P WHERE O.PROJNO = P."PROJNO" AND P."EMPNO" = E.EMPNO GROUP BY O.CUSTNAME, P."PROJNO", E.ENAME;
ビューとシノニムの組合せを介して次のSQL文を使用すると、分散問合せの処理が透過的になります。
CREATE SYNONYM ORDERS FOR ORDERS@DB2; CREATE SYNONYM PROJECTS FOR "PROJECTS"@SYBS; CREATE VIEW DETAILS (CUSTNAME,PROJNO,ENAME,SPEND) AS SELECT O.CUSTNAME, P."PROJNO", E.ENAME, SUM(E.RATE*P."HOURS") SPEND FROM ORDERS O, EMP E, PROJECTS P WHERE O.PROJNO = P."PROJNO" AND P."EMPNO" = E.EMPNO GROUP BY O.CUSTNAME, P."PROJNO", E.ENAME;
次のSQL文を使用して、1つの文でデータ・ストアから情報を取得します。
SELECT * FROM DETAILS;
この文では次の表が取得されます。
CUSTNAME PROJNO ENAME SPEND -------- ------ ----- ----- ABC Co. 1 Jones 400 ABC Co. 1 Smith 180 XYZ Inc. 2 Jones 400 XYZ Inc. 2 Smith 180
異機種間サービスでは、コールバック・リンクがサポートされます。これにより、次のようなSQL文を実行できます。
INSERT INTO table_name@dblink SELECT column_list FROM table_name;
異機種間サービスではコールバック機能がサポートされますが、この機能が実装されていないゲートウェイもあります。使用中のゲートウェイにこの機能が実装されていない場合、前述のINSERT
文では次のエラー・メッセージが戻されます。
ORA-02025: All tables in the SQL statement must be at the remote database
関連項目: コールバック・リンクのサポートについては、ゲートウェイのマニュアルを参照してください。 |
コールバック・リンクをサポートしていないゲートウェイの場合は、SQL*PlusのCOPY
コマンドを使用できます。構文は次のとおりです。
COPY FROM username/password@db_name
-
INSERT destination_table -
USING query;
次の例では、ローカルのOracleのemp
表からすべての行が選択され、Oracle以外のデータベースのemp
表に挿入され、トランザクションがコミットされます。
COPY FROM SCOTT/TIGER@inst1 - INSERT EMP@remote_db - USING SELECT * FROM EMP;
TheCOPY
command supports theAPPEND
,CREATE
,INSERT
, andREPLACE
options. However,INSERT
is the only option supported when copying to non-Oracle databases. The SQL*PlusCOPY
command does not support copying to tables with lowercase table names. Use the following PL/SQL syntax with lowercase table names: DECLARE v1 oracle_table.column1%TYPE; v2 oracle_table.column2%TYPE; v3 oracle_table.column3%TYPE; . . . CURSOR cursor_name IS SELECT * FROM oracle_table; BEGIN OPEN cursor_name; LOOP FETCH cursor_name INTO v1, v2, v3, ... ; EXIT WHEN cursor_name%NOTFOUND; INSERT INTO destination_table VALUES (v1, v2, v3, ...); END LOOP; CLOSE cursor_name; END;
関連項目: COPY コマンドの詳細は、『SQL*Plusユーザーズ・ガイドおよびリファレンス』を参照してください。 |
CREATE TABLE
文を使用すると、Oracle以外のデータベースからOracleデータベースにデータをコピーできます。ローカル・データベースに表を作成し、Oracle以外の表から行を挿入するには、次の構文を使用します。
CREATE TABLE table_name AS query;
次の例では、ローカルのOracleデータベースにemp
表が作成され、Oracle以外のデータベースのEMP
表から行が挿入されます。
CREATE TABLE table1 AS SELECT * FROM "EMP"@remote_db;
Alternatively, you can use the SQL*PlusCOPY
command to copy data from the non-Oracle database to the Oracle database server.
関連項目: COPY コマンドの詳細は、『SQL*Plusユーザーズ・ガイドおよびリファレンス』を参照してください。 |
異機種間サービスのデータ・ディクショナリ・ビューを使用すると、異機種間サービスに関する情報にアクセスできます。この節では、以下のトピックについて説明します。
異機種間サービスのデータ・ディクショナリ・ビューは、次のカテゴリに分類できます。ビュー名はすべて接頭辞HS_
で始まります。
データ・ディクショナリ・ビューのほとんどは、クラスとインスタンスの両方に対して定義されています。ほとんどのタイプのデータには、*_CLASS
ビューと*_INST
ビューがあります。詳細は、表4-1を参照してください。
表4-1 異機種間サービスのデータ・ディクショナリ・ビュー
ビュー | 型 | 識別内容 |
---|---|---|
SQLサービス |
異機種間サービスでサポートされている全機能 |
|
SQLサービス |
異機種間サービスでサポートされている、すべてのデータ・ディクショナリ変換表名 |
|
トランザクション・サービス、SQLサービス |
各クラスの機能 |
|
SQLサービス |
各クラスのデータ・ディクショナリ変換 |
|
汎用 |
各クラスの初期化パラメータ |
|
汎用 |
Oracleサーバーからアクセス可能なクラス |
|
汎用 |
Oracleサーバーからアクセス可能なインスタンス |
|
トランザクション・サービス、SQLサービス |
各インスタンスの機能(DBAが設定している場合) |
|
SQLサービス |
各クラスのデータ・ディクショナリ変換(DBAが設定している場合) |
|
汎用 |
各インスタンスの初期化パラメータ(DBAが設定している場合) |
|
バルク・ロード・プロシージャで作成した内部オブジェクトを追跡するためのデータ・ディクショナリ・ビュー。 |
すべてのOracleデータ・ディクショナリ表と同様に、これらのビューは読取り専用です。基礎となる表の内容は変更しないでください。
異機種間サービス・データベース・リンクを介した特定の接続でデータ・ディクショナリの内容として使用される値は、次のソースから取得できます。各ソースを優先順に示します。
セッションの開始時に接続先異機種間サービス・エージェントによりアップロードされるインスタンス情報。この情報により、Oracleデータ・ディクショナリ内の対応する内容がオーバーライドされますが、Oracleデータ・ディクショナリには格納されません。
Oracleデータ・ディクショナリに格納されているインスタンス情報。このデータにより、接続先クラスの対応する内容がオーバーライドされます。
Oracleデータ・ディクショナリに格納されているクラス情報。
Oracleデータベース・サーバーの実行時にHS_AUTOREGISTER
サーバー初期化パラメータがFALSE
に設定されている場合、Oracleデータ・ディクショナリに情報が自動的に格納されることはありません。接続が確立されるたびに、接続ごとに異機種間サービス・エージェントにより等価のデータがアップロードされ、インスタンス固有の情報がクラス情報より優先されます。
注意: エージェントがインスタンス情報をアップロードできる可能性があるため、特定のセッションに使用中の機能とデータ・ディクショナリ変換は明確に判断できません。 |
V$HS_PARAMETER
ビューのVALUE
列を問い合せると、異機種間サービスの初期化パラメータの値を判断できます。V$HS_PARAMETER
のVALUE
列では、実際の初期化パラメータ値が最大255文字から最大64文字に切り捨てられることに注意してください。パラメータ名は最大64文字から最大30文字に切り捨てられます。
ビュー | 内容 |
---|---|
HS_FDS_CLASS |
Oracleデータ・ディクショナリにアップロードされたクラスの名前 |
HS_FDS_INST |
Oracleデータ・ディクショナリにアップロードされたインスタンスの名前 |
HS_CLASS_INIT |
異機種間サービス初期化パラメータに関する情報 |
たとえば、Oracleデータベース・サーバーから複数のSybaseゲートウェイにアクセスできます。ゲートウェイに初めてアクセスすると、Oracleデータベース・サーバーにアップロードされた情報が次のように表示される場合があります。
SQL> SELECT * FROM HS_FDS_CLASS; FDS_CLASS_NAME FDS_CLASS_COMMENTS FDS_CLASS_ID --------------------- ------------------------------ ------------ Sybase816 Uses Sybase driver, R1.1 1 Sybase817 Uses Sybase driver, R1.2 21
2つのクラス(Sybase816にアクセスするクラスとSybase817にアクセスするクラス)がアップロードされています。Oracleデータベース・サーバーのデータ・ディクショナリには、Sybase816とSybase817の両方のための機能情報、SQL変換およびデータ・ディクショナリ変換が含まれます。
Oracleデータベース・サーバーのデータ・ディクショナリには、アクセス対象であるOracle以外の各システム・インスタンスに対するHS_FDS_INST
ビューのインスタンス情報も含まれます。
Oracle以外のシステムが分散トランザクションに関係する場合、分散トランザクションに関与できるかどうかは、そのシステムとエージェントのトランザクション機能により制御されます。トランザクション機能は、HS_CLASS_CAPS
表に格納されます。
Oracle以外のシステムとエージェントが2フェーズ・コミット・プロトコルをサポートできるかどうかは、2PCタイプの機能により指定されます。次の表に示すタイプのいずれかを指定できます。
型 | 機能 |
---|---|
読取り専用(RO) | Oracle以外のシステムに対して実行できるのは、SQLのSELECT 文を使用した問合せのみです。プロシージャ・コールはデータを書き込むと想定されるため許可されません。 |
単一サイト(SS) | Oracle以外のシステムでリモート・トランザクションを処理できますが、分散トランザクションは処理できません。つまり、2フェーズ・コミット・プロトコルには関与できません。 |
コミット確認(CC) | Oracle以外のシステムが分散トランザクションに関与できます。サーバーの2フェーズ・コミット・プロトコルには、コミット・ポイント・サイトとしてのみ関与できます。つまり、データを準備できませんが、グローバル・コーディネータから要求された場合は、特定のトランザクションの結果を記憶できます。 |
2フェーズ・コミット(2PC) | Oracle以外のシステムが分散トランザクションに関与できます。サーバーの2フェーズ・コミット・プロトコルには、コミット・ポイント・サイトではなく通常の2フェーズ・コミット・ノードとして関与できます。つまり、データを準備できますが、グローバル・コーディネータから要求されても特定のトランザクションの結果を記憶できません。 |
2フェーズ・コミット確認(2PCC) | Oracle以外のシステムが分散トランザクションに関与できます。サーバーの2フェーズ・コミット・プロトコルには、通常の2フェーズ・コミット・ノードまたはコミット・ポイント・サイトとして関与できます。つまり、データを準備でき、グローバル・コーディネータから要求された場合は、特定のトランザクションの結果を記憶できます。 |
異機種間サービスのHS_CLASS_CAPS
データ・ディクショナリ・ビューを使用すると、ドライバとOracle以外のシステムでサポートされているトランザクション・モデルを問い合せることができます。
次に、2PCタイプの機能の1つを示します。
SELECT cap_description, translation FROM hs_class_caps WHERE cap_description LIKE '2PC%' AND fds_class_name LIKE 'SYBASE%'; CAP_DESCRIPTION TRANSLATION ---------------------------------------- ----------- 2PC type (RO-SS-CC-PREP/2P-2PCC) CC
When the non-Oracle system and agent support distributed transactions, the non-Oracle system is treated like any other Oracle server. When a failure occurs during the two-phase commit protocol, the transaction is recovered automatically. If the failure persists, the in-doubt transaction may need to be manually overridden by the database administrator.
SQLサービス固有のデータ・ディクショナリ・ビューには、次の情報が含まれています。
Oracle以外のデータ・ソースのSQL機能とSQL変換
Oracleデータ・ディクショナリ・ビューからOracle以外のシステムのデータ・ディクショナリへのマッピングに使用されるデータ・ディクショナリ変換
注意: この項では、SQLサービス関連機能の一部についてのみ説明します。これらの設定を管理上の目的で変更する必要はないため、これらの機能についてはこの項では説明しません。 |
HS_*_CAPS
データ・ディクショナリ表には、Oracle以外のデータ・ソースのSQL機能と必須のSQL変換に関する情報が含まれています。これらのビューでは、Oracle以外のデータ・ストアまたはOracleデータベース・サーバーに特定のSQL言語機能が実装されるかどうかが指定されます。機能がオフになっている場合、Oracleでは、その機能を必要とするOracle以外のデータ・ソースにSQL文は送信されませんが、後処理は実行されます。
Oracle以外のシステムがOracleデータベース・サーバーと同様にみえるように、異機種間サービス接続により、Oracleデータ・ディクショナリ・ビューの限定セットがOracle以外のシステムのデータ・ディクショナリにマップされます。このマッピングにより、アプリケーションでは、これらのビューがOracleデータ・ディクショナリに属している場合と同様に問合せを発行できます。このアクセスは、データ・ディクショナリ変換により可能になります。これらの変換は、名前に接尾辞_DD
を含む各異機種間サービス・ビューに格納されます。
たとえば、次のSELECT
文は、Sybaseのデータ・ディクショナリ表からemp
表の情報を取得するSybaseの問合せに変換されます。
データ・ディクショナリ表は、変換するかわりに疑似実行できます。必要な情報がOracle以外のデータ・ソースのデータ・ディクショナリにないために、データ・ディクショナリ変換ができない場合、異機種間サービスではデータ・ディクショナリ表が使用可能であるかのように表示されますが、表には情報が含まれていません。
Oracle以外のシステム用に変換または疑似実行されるOracleデータ・ディクショナリ・ビューまたは表の情報を取得するには、ユーザーSYS
として接続し、HS_CLASS_DD
ビューに対して次の問合せを発行します。
SELECT DD_TABLE_NAME, TRANSLATION_TYPE FROM HS_CLASS_DD WHERE FDS_CLASS_NAME LIKE 'SYBASE%'; DD_TABLE_NAME T ----------------------------- - ALL_ARGUMENTS M ALL_CATALOG T ALL_CLUSTERS T ALL_CLUSTER_HASH_EXPRESSIONS M ALL_COLL_TYPES M ALL_COL_COMMENTS T ALL_COL_PRIVS M ALL_COL_PRIVS_MADE M ALL_COL_PRIVS_RECD M ...
変換タイプT
は、変換が存在することを示します。変換タイプがM
の場合は、データ・ディクショナリ表が疑似実行されます。
Oracleデータベース・サーバーでは、エージェント、セッションおよびパラメータに関する情報が格納されます。動的パフォーマンス・ビューを使用すると、この情報にアクセスできます。この項の内容は次のとおりです。
V$HS_AGENT
では、指定されたホスト上で現在実行中の異機種間サービス・エージェントのセットを識別します。表4-2に、最も関連のある列を示します。このビューの各列の詳細は、『Oracle Databaseリファレンス』を参照してください。
V$HS_SESSION
ビューには、エージェントごとのセッションが表示され、使用されるデータベース・リンクが指定されます。表4-3に、最も関連のある列を示します。このビューの各列の詳細は、『Oracle Databaseリファレンス』を参照してください。
V$HS_PARAMETER
ビューには、Oracleデータベース・サーバーに登録済の異機種間サービスのパラメータと値が表示されます。表4-4に、最も関連のある列を示します。このビューの各列の詳細は、『Oracle Databaseリファレンス』を参照してください。
表4-4 V$HS_SESSIONビューの重要な列
列 | 説明 |
---|---|
|
異機種間サービスの一意のセッションID |
|
異機種間サービス・パラメータ名 |
|
異機種間サービス・パラメータの値 |
分散接続の確立に使用されたデータベース・リンク、起動時刻、およびセッションに使用された初期化パラメータのセットに関する情報も表示できます。ランタイム情報は、すべて動的に更新される表から導出されます。