2.9 Remote Data Access
SQL Anywhereでは、クライアントが現在接続しているデータベースから別のデータベースにアクセスできる。SQL Anywhereとほかのデータベースとを連携でき、データの移行(ほかのデータベースからSQL Anywhereへ、またはその逆)に都合が良い。
クライアントが現在接続しているデータベースを「Local DB」と呼び、それ以外のデータベースを「Remote DB」と呼ぶことにする(図2.12)。また、Local DB内とRemote DB内の通常のテーブルを、それぞれ「Local Table」、「Remote Table」と呼ぶ。このとき、Local DB上でRemote Tableへのアクセスを可能にするのがRemote Data Accessと呼ばれる機能だ。
サポートするRemote DBは、SQL Anywhereに限らず、Sybase AdaptiveServer Enterprise、Oracle、IBM DB2、Microsoft SQL Server/Excel/Access、そのほかODBC接続できるものである。また、Remote DBは、Local DBと同じマシン上で動作しているものでもよいし、別のマシン上であってもよい(*7)。
SQL Anywhereでは、Remote Tableに対してProxy Tableと呼ばれるテーブルをLocal DBに定義できる。クライアントからみれば、Proxy TableはLocal Tableのように振る舞うので、クライアントはあたかもRemote TableがLocal DBにあるかのようにそのデータにアクセスできる。Proxy Table自体がデータを保持することはないが、Proxy Tableに対するクエリがRemote Table用に書き換えられて再送信されるので、このような仕組みが実現できるのである。
Proxy Tableに対するアクセスは、読み書き共に可能だ。しかし、パフォーマンスはLocal Tableのアクセスよりも劣る。リモート通信が介在し、クエリの最適化が十分に行えないからだ。
実際に、Proxy Tableを作成するための手順を見ていこう。Sybase CentralからGUIでの操作も可能だが、以下ではSQL文でのやり方を説明する。なお、これから示す手順はすべてLocal DBに対する操作であり、Remote DBにあらかじめRemoteTableがあることを前提としている。
2.9.1 リモートサーバの定義
まず、CREATE SERVER文で、Remote DBをリモートサーバとして定義する。
CREATE SERVER remoteasa CLASS 'ASAODBC' USING 'remote_dsn'
remoteasaが、Local DB内でRemote DBを識別するための名前である。CLASS句で、Remote DBの種別を指定する。指定可能なものは、以下の8つだ。製品名と接続方法とからなる文字列なので説明は不用だろう。
- ASAJDBC
- ASEJDBC
- ASAODBC
- ASEODBC
- DB2ODBC
- MSSODBC
- ORAODBC
- ODBC
USING句では、Remote DBへの接続情報を指定する。ただし、あらかじめ、Remote DBに対するODBCデータソースがremote_dsnという名前で定義されているものとする。
2.9.2 ログイン情報の設定
Remote DBにアクセスするにあたり、デフォルトでは、Local DBへのアクセスで用いたのと同じユーザーID・パスワードが利用される。Local DBとRemote DBとでユーザーID・パスワードが一致するならログイン情報の設定は不要だが、異なる場合は設定が必要だ。
CREATE EXTERNLOGIN fred TO remoteasa REMOTE LOGIN frederick IDENTIFIED BY banana
上記の例では、Local DBのユーザーfredがリモートサーバremoteasaにアクセスするときは、frederick/bananaというユーザー名・パスワードを使用することを指定している。
2.9.3 Proxy Tableの定義
いよいよProxy Tableを定義する。Remote DB上のemployeeテーブルに対するProxy Tableを、p_employeeという名前でLocal DB上に定義するには、次のようにする。
CREATE EXISTING TABLE p_employee AT 'remoteasa..DBA.employee'
AT句で、リモートサーバ名やテーブル名を指定する(「..」は表記ミスではないので注意)。ここでは、remoteasaサーバ上のDBAユーザーのemployeeテーブルとなっている。構文の詳細はヘルプを参照してもらいたい。
これで、employeeテーブルに対するProxy Tableがp_employeeとして定義され、p_employeeテーブルに対する読み書きや、ほかのテーブルとのJOINなどが可能となる。Proxy Table同士もJOIN可能だ。
2.9.4 ほかのデータベースからのデータ移行
Proxy Tableの機能を使えば、ほかのデータベース上のデータをSQL Anywhere上に容易に移行できる。そのためには、上記の手順をたどってProxy Tableを作成し、そこからSELECT文で抽出した結果をLocal Tableに挿入(INSERT)すればよい。しかし実は、これらの手順をまとめたsa_migrateプロシージャがあらかじめ用意されているので、それを利用するだけでデータの移行が可能だ。
CREATE SERVER文でリモートサーバを定義した後、sa_migrateプロシージャを実行する。
CALL sa_migrate( 'local_user', 'remote_server', NULL, 'remote_user', NULL, 1, 1, 1 )
この文の意味は、「remote_server」リモートサーバ上の「remote_user」ユーザーが所有するすべてのテーブルを、データを含めてローカルデータベースに移行し、「local_user」ユーザーの所有とする、となる。
引数の最後の3つはフラグになっていて、(1) データを移行するかどうか、(2) 実行中に生成されたproxy tableを削除するかどうか、(3) 外部キーを生成するかどうか、を指定できる。
2.10 暗号化
SQL Anywhereには、暗号化機能として、データベースファイルの暗号化と通信の暗号化とがある。
例えば、データベースをモバイルデバイスに入れて持ち歩く際、デバイスを紛失したり盗難にあったりすることもある。この場合、データベースファイルをダンプすればデータを見ることができるため、貴重な情報が漏洩する恐れがある。しかし、データベースファイルを暗号化しておけば、ダンプしたデータを解読することはできず、また、暗号化キーがなければデータベースを起動できないのでセキュリティが高まる。
一方、ネットワーク経由でデータベース通信をする際、通信データが盗聴される危険があるが、通信を暗号化しておけばそのような恐れはない。
2.10.1 データベースファイルの暗号化
AES(Advanced Encryption Standard)アルゴリズムを用いてデータベースファイルとトランザクションログファイルとを暗号化する。暗号化オプションはデータベース作成時に指定するので、既存のデータベースを暗号化する場合はデータベースを再構築しなければならない(再構築に関しては「2.11 データベースファイルの再構築」で説明する)。暗号化するにはキーとなる文字列が必要となる。dbinitコマンドの-ekオプションで文字列として指定する。もしくは、-epオプションを指定すると、キー入力ダイアログが現れるので、そこに入力する。
$ dbinit -ek "0kZ2o56AK#" "encrypted.db"
暗号化されたデータベースを起動するには、同じキーが必要になる。
$ dbeng9 encrypted.db -ek "0kZ2o56AK#"
これで、データは暗号化されてファイルに記録される。
2.10.2 通信の暗号化
ODBC、OLE DB、Embedded SQLによるクライアント・サーバ間のTCP/IP通信を暗号化できる。ただし、TDS(Tabular Data Stream。jConnect、SybaseCentral、Interactive SQLで利用できる)やOpen Clientによる通信は暗号化できない。暗号アルゴリズムはRSAと楕円曲線暗号から選択する(*8)。
なお、SQL Anywhere 10ではライセンス体系が変わり、RSAについては標準で利用可能である。
サーバ側の設定
サーバ側では次のように指定する。
$ dbsrv9 -x tcpip -ec RSA_TLS asademo.db
-ecオプションでは、表2.6に示す5つの中から、接続を受け入れる通信方式をカンマで区切って列挙する。
通信方式 | 説明 |
none | 暗号化されていない通信のみ可能 |
simple | 簡易的な暗号のみ可能(*9) |
ECC_TLS | ECC暗号のみ可能 |
RSA_TLS | RSA暗号のみ可能 |
all | 暗号化にかかわらず、すべて可能(デフォルト) |
前出の例では、RSA暗号オプションだけが指定されているので、すべての通信がRSA暗号化される。後述するように、クライアント側でも接続する通信方式を指定できるので、クライアント側の設定にRSA_TLSが含まれていなければ、接続が拒否される。
なお、ここでの指定にかかわらず、TDSやOpen Clientによる通信は受け入れられ、暗号化されずにやり取りされる。
クライアント側の設定
Encryption接続パラメータで、利用したい通信方式を1つ指定する。サーバ側の設定で説明したものと同じ5つの値がある。
"ENG=asademo; LINKS=tcpip; Encryption=RSA_TLS"
クライアント側の設定とサーバ側の設定を照らし合わせ、接続可能な方式がある場合のみ接続が確立する。なお、サーバ証明書を用いて、サーバを認証することも可能だ。
次回
次回は、データベースファイルの再構築やSQL Anywhereのアップデート、サイレントインストールなどについて紹介する。社内評価や開発を目的としたSQL Anywhereの利用であれば、無償のDeveloper Editionを利用できるので、ぜひ一度、実際に試していただきたい。