アプリケーションによるデータおよびスキーマ・オブジェクトへのアクセスを分散データベース・システム全体にわたってサポートするために、必要なデータベース・リンクをすべて作成する必要があります。この項の内容は、次のとおりです。
データベース・リンクは、リモート・データベースのオブジェクトへのアクセスを可能にするローカル・データベース内のポインタです。プライベート・データベース・リンクを作成するには、あらかじめ適切な権限が付与されている必要があります。次の表は、どのリンク・タイプのデータベースに対してどの権限が必要なのかを示しています。
| 権限 | データベース | この権限を必要とする操作 |
|---|---|---|
CREATE DATABASE LINK |
ローカル | プライベート・データベース・リンクの作成 |
CREATE PUBLIC DATABASE LINK |
ローカル | パブリック・データベース・リンクの作成 |
CREATE SESSION |
リモート | 任意タイプのデータベース・リンクの作成 |
現在使用可能な権限を確認するには、ROLE_SYS_PRIVSを問い合せます。たとえば、次のprivs.sqlスクリプトを作成し、実行できます(出力例も含まれています)。
SELECT DISTINCT PRIVILEGE AS "Database Link Privileges"
FROM ROLE_SYS_PRIVS
WHERE PRIVILEGE IN ( 'CREATE SESSION','CREATE DATABASE LINK',
'CREATE PUBLIC DATABASE LINK')
/
SQL> @privs
Database Link Privileges
----------------------------------------
CREATE DATABASE LINK
CREATE PUBLIC DATABASE LINK
CREATE SESSION
データベース・リンクを作成するときは、そのデータベース・リンクにアクセスするユーザーを決める必要があります。ここでは、3種類の基本的なリンク・タイプの作成方法について説明します。
プライベート・データベース・リンクを作成するには、次の文を指定します。ここで、link_nameはグローバル・データベース名または任意のリンク名を表します。
CREATE DATABASE LINK link_name ...;
プライベート・データベース・リンクの例を次に示します。
| SQL文 | 結果 |
|---|---|
CREATE DATABASE LINK supply.us.example.com; |
リモートのsupplyデータベースへの、グローバル・データベース名を使用したプライベート・リンク。
リンクは、接続ユーザーのユーザーID/パスワードを使用します。そのため、 |
CREATE DATABASE LINK link_2 CONNECT TO jane IDENTIFIED BY password USING 'us_supply'; |
サービス名us_supplyを持つデータベースへの、link_2という名前のプライベート固定ユーザー・リンク。このリンクは、接続ユーザーとは無関係に、jane/passwordというユーザーID/パスワードでリモート・データベースに接続します。 |
CREATE DATABASE LINK link_1 CONNECT TO CURRENT_USER USING 'us_supply'; |
サービス名us_supplyを持つデータベースへの、link_1という名前のプライベート・リンク。このリンクは、現行ユーザーのユーザーID/パスワードを使用してリモート・データベースにログインします。
注意: 現行ユーザーと接続ユーザーは異なる場合があります。また、現行ユーザーは、リンクに関係している両方のデータベースのグローバル・ユーザーであることが必要です(「データベース・リンクのユーザー」を参照)。現行ユーザー・リンクは、Oracle Advanced Securityオプションの一部です。 |
|
関連項目: CREATE DATABASE LINKの構文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
パブリック・データベース・リンクを作成するには、キーワードPUBLICを使用します。ここで、link_nameはグローバル・データベース名または任意のリンク名を表します。
CREATE PUBLIC DATABASE LINK link_name ...;
パブリック・データベース・リンクの例を次に示します。
| SQL文 | 結果 |
|---|---|
CREATE PUBLIC DATABASE LINK supply.us.example.com; |
リモートのsupplyデータベースへのパブリック・リンク。リンクは、接続ユーザーのユーザーID/パスワードを使用します。そのため、scott(パスワード: password)が問合せの中でこのリンクを使用すると、リモート・データベースへの接続がscott/passwordとして確立されます。 |
CREATE PUBLIC DATABASE LINK pu_link CONNECT TO CURRENT_USER USING 'supply'; |
サービス名supplyを持つデータベースへの、pu_linkという名前のパブリック・リンク。このリンクは、現行ユーザーのユーザーID/パスワードを使用してリモート・データベースにログインします。
注意: 現行ユーザーと接続ユーザーは異なる場合があります。また、現行ユーザーは、リンクに関係している両方のデータベースのグローバル・ユーザーであることが必要です(「データベース・リンクのユーザー」を参照)。 |
CREATE PUBLIC DATABASE LINK sales.us.example.com CONNECT TO jane IDENTIFIED BY password; |
リモートのsalesデータベースへのパブリック固定ユーザー・リンク。このリンクは、jane/passwordというユーザーID/パスワードでリモート・データベースに接続します。 |
|
関連項目: CREATE PUBLIC DATABASE LINKの構文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
以前のリリースでは、グローバル・データベース・リンクはOracle Names Serverで定義していました。Oracle Names Serverは非推奨になりました。現在はディレクトリ・サーバーが使用できるようになり、データベースはネット・サービス名によって識別されるようになりました。このマニュアルでは、ディレクトリ・サーバーでのネット・サービス名によるデータベースの識別をグローバル・データベース・リンクと呼びます。
グローバル・データベース・リンクとして動作するディレクトリ・エントリの作成方法の詳細は、『Oracle Database Net Services管理者ガイド』を参照してください。
データベース・リンクは、あるデータベースから別のデータベースへの通信経路を定義します。アプリケーションがデータベース・リンクを使用してリモート・データベースに接続するとき、Oracle Databaseはローカル・アプリケーションの要求にかわってリモート・データベース内でデータベース・セッションを確立します。
プライベートまたはパブリックのデータベース・リンクを作成する際、固定ユーザー、現行ユーザーおよび接続ユーザーのデータベース・リンクを作成することで、リモート・データベースのどのスキーマにリンクが接続を確立するのかを指定できます。
固定ユーザー・データベース・リンクを作成するには、リモート・データベースへのアクセスに必要な資格証明(この場合はユーザー名とパスワード)をリンク定義に埋め込みます。
CREATE DATABASE LINK ... CONNECT TO username IDENTIFIED BY password ...;
固定ユーザー・データベース・リンクの例を次に示します。
| SQL文 | 結果 |
|---|---|
CREATE PUBLIC DATABASE LINK supply.us.example.com CONNECT TO scott AS password; |
リモートのsupplyデータベースへの、グローバル・データベース名を使用したパブリック・リンク。このリンクは、scott/passwordというユーザーID/パスワードでリモート・データベースに接続します。 |
CREATE DATABASE LINK foo CONNECT TO jane IDENTIFIED BY password USING 'finance'; |
サービス名financeを持つデータベースへの、fooという名前のプライベート固定ユーザー・リンク。このリンクは、jane/passwordというユーザーID/パスワードでリモート・データベースに接続します。 |
アプリケーションで固定ユーザー・データベース・リンクを使用するとき、ローカル・サーバーは必ずリモート・データベース内の固定リモート・スキーマへの接続を確立します。また、ローカル・サーバーはアプリケーションがリンクを使用してリモート・データベースにアクセスするときに、ネットワークを介して固定ユーザーの資格証明を送信します。
接続ユーザーおよび現行ユーザー・データベース・リンクでは、リンク定義に資格証明が含まれません。リモート・データベースへの接続に使用する資格証明は、データベース・リンクを参照するユーザーや、アプリケーションが実行する操作によって異なります。
|
注意: 多くの分散アプリケーションでは、ユーザーがリモート・データベースでの権限を持つ必要はありません。これを実現する簡単な方法の1つは、固定ユーザーまたは現行ユーザーのデータベース・リンクを含むプロシージャを作成することです。この方法では、プロシージャにアクセスするユーザーに対して第三者の権限が一時的に付与されます。 |
接続ユーザーと現行ユーザーの区別に関する概念の詳細は、「データベース・リンクのユーザー」を参照してください。
接続ユーザー・データベース・リンクを作成するには、CONNECT TO句を省略します。次の構文は、接続ユーザー・データベース・リンクを作成し、ここでdblinkはリンクの名前、net_service_nameはオプションの接続文字列を表します。
CREATE [SHARED] [PUBLIC] DATABASE LINK dblink ... [USING 'net_service_name'];
たとえば、接続ユーザー・データベース・リンクを作成するために、次の構文を使用します。
CREATE DATABASE LINK sales.division3.example.com USING 'sales';
現行ユーザー・データベース・リンクを作成するには、リンク作成文でCONNECT TO CURRENT_USER句を使用します。現行ユーザー・リンクは、Oracle Advanced Securityオプションでのみ使用できます。
次の構文は、現行ユーザー・データベース・リンクを作成します。ここで、dblinkはリンクの名前、net_service_nameはオプションの接続文字列を表します。
CREATE [SHARED] [PUBLIC] DATABASE LINK dblink CONNECT TO CURRENT_USER [USING 'net_service_name'];
たとえば、salesデータベースへの現行ユーザー・データベース・リンクを作成するには、次の構文を使用します。
CREATE DATABASE LINK sales CONNECT TO CURRENT_USER USING 'sales';
|
注意: 現行ユーザー・データベース・リンクを使用するには、リンクに関係している両方のデータベースで現行ユーザーがグローバル・ユーザーであることが必要です。 |
|
関連項目: データベース・リンクの作成に関する構文情報の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
場合によっては、同じリモート・データベースを指すものの、異なる通信経路を使用してリモート・データベースへの接続を確立する同じタイプ(パブリックなど)のデータベース・リンクを複数作成する必要があります。次のような場合に、この方法が役立ちます。
リモート・データベースがOracle Real Application Clusters構成の一部であり、そのためリモート・データベースの特定のインスタンスに接続を確立できるようにローカル・ノードで複数のパブリック・データベース・リンクを定義する場合
Oracle Databaseサーバーへの接続に、TCP/IPを使用するクライアントと、DECNETを使用するクライアントがある場合
このような機能を容易にするため、データベースでは、データベース・リンクにオプションのサービス名を付加したデータベース・リンク名を作成できます。データベース・リンクを作成するときに、サービス名を@記号で区切って(たとえば、@sales)、データベース・リンク名の末尾の部分として指定します。この文字列は接続修飾子と呼ばれます。
たとえば、リモート・データベースhq.example.comがOracle Real Application Clusters環境で管理されているとします。hqデータベースには、hq_1およびhq_2という名前の2つのインスタンスがあります。ローカル・データベースで次のパブリック・データベース・リンクを作成して、hqデータベースのリモート・インスタンスへの経路を定義できます。
CREATE PUBLIC DATABASE LINK hq.example.com@hq_1 USING 'string_to_hq_1'; CREATE PUBLIC DATABASE LINK hq.example.com@hq_2 USING 'string_to_hq_2'; CREATE PUBLIC DATABASE LINK hq.example.com USING 'string_to_hq';
最初の2つの例では、サービス名は単なるデータベース・リンク名の一部であることに注目してください。サービス名のテキストは必ずしも接続の確立方法を示しているわけではないため、この情報はUSING句のサービス名で指定されています。また、3番目の例では、サービス名がリンク名の一部として指定されていないことに注目してください。この場合も、サービス名がリンク名の一部として指定されたときと同じように、インスタンスはUSING文字列によって決定されます。
サービス名を使用して特定のインスタンスを指定するには、サービス名をグローバル・オブジェクト名の末尾に付けます。
SELECT * FROM scott.emp@hq.example.com@hq_1
この例では、2つのアットマーク(@)があることに注意してください。