データベース・リンクには、以下の3つのタイプがある。
データリンクの作成のためには、CREATE {PUBLIC} DATABASE LINK権限が必要である。データリンクを作成するためには、以下のSQL文を発行する。
CREATE {PUBLIC} DATABASE LINK (リンク名) {CONNECT TO (ユーザ名) IDENTIFIED BY (パスワード)} USING (サービス名)
それぞれのキーワードの意味は以下の通り。
キーワード | 意味 |
---|---|
{PUBLIC} | これを指定した場合、すべてのユーザが使用できるパブリック・リンクが作成される。そうでなければ、作成者のみがリンクを利用できる。なお、別のユーザのスキーマにリンクを作成することはできない。 |
リンク名 | 初期化パラメータGLOBAL_NAMESがTrueの場合、リンク先データベースのグローバル・データベース名と同じものを指定しなければならない。同じドメインにあるなら、ドメイン名を省略できる。また、同一のグローバル・データベースに別々のサービス名を用いて複数のデータリンクを設定することができる。その場合、データリンクの書式は(グローバル・データベース名)@(修飾接続詞)となる。 |
CONECT TO | 接続に使用するユーザを明示的に指定する場合に使用。これを省略すると、利用者のユーザ名が接続先でも使用される。 |
サービス名 | tnsnames.oraで指定されるサービス名。サービス名はグローバル・データベース名と同じである(とマニュアルには書いてあるが、この記述は上記の説明と矛盾する。「理由の無い場合、正式名称は〜」ということであろう。ちなみに、別名をつけることを禁止するオプションは無いようだ。) |
1つのセッションで利用できるデータベースリンクの個数は、初期化パラメータOPEN_LINKSで指定される。また、パブリック・プライベートなデータベースリンクについての情報は、それぞれDBA_DB_LINKS・USER_DB_LINKSというデータディクショナリビューから参照できる。
データリンク先のオブジェクトは、オブジェクト名をリンク名で修飾することで利用可能となる。
SELECT * FROM [email protected]
ここで、リンク名を隠して透過的なアクセスを実現する方法として、以下のような方法がある。
オブジェクトに別名を与える機能であるシノニムは、リモートオブジェクトに対しても使用できる。例えば、データリンク先remote1.worldでスキーマscottに属するテーブルempへのシノニムを定義するためには、以下のような構文が必要となる。
CREATE SYNONYM emp FOR [email protected]
前記の方法とは別に、ビューやプロシージャを経由してアクセスを行う場合には、その内部でデータリンクを利用することで位置を隠すことができる。前項と同じ内容をビューの定義で実現しようとした場合、以下のような構文を使用する。
CREATE VIEW emp AS SELECT * FROM [email protected]
なお、ビューを作成した場合は作成者が権限を他のユーザに与えることができるが、シノニムを作成した場合にはそれを行うことはできない。