SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

SQL Anywhereの魅力を探る

SQL Anywhereでの主キー/スケジュール処理/暗号化

SQL Anywhereの魅力を探る 4


  • このエントリーをはてなブックマークに追加

2.9 Remote Data Access

 SQL Anywhereでは、クライアントが現在接続しているデータベースから別のデータベースにアクセスできる。SQL Anywhereとほかのデータベースとを連携でき、データの移行(ほかのデータベースからSQL Anywhereへ、またはその逆)に都合が良い。

図2.12 : Local DBとRemote DBの概念図
図2.12 : Local DBとRemote DBの概念図

 クライアントが現在接続しているデータベースを「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があることを前提としている。

*7
 複数のSQL Anywhereデータベースが同じデータベースサーバで管理されていたとしても、それらは別々で、Remote DBとLocal DBの関係である。

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#"

 これで、データは暗号化されてファイルに記録される。

 SQL Anywhere 10では、さらにテーブル単位での暗号化に対応している。

2.10.2 通信の暗号化

 ODBC、OLE DB、Embedded SQLによるクライアント・サーバ間のTCP/IP通信を暗号化できる。ただし、TDS(Tabular Data Stream。jConnect、SybaseCentral、Interactive SQLで利用できる)やOpen Clientによる通信は暗号化できない。暗号アルゴリズムはRSAと楕円曲線暗号から選択する(*8)。

*8
 SQL Anywhere 9には、RSAとRSA-FIPS・楕円曲線暗号の3つの暗号方式があり、どれも別ライセンスとなっている。SQL Anywhereのインストール時に、対応するライセンスキーを登録することで、暗号化通信オプションが利用可能となる。
なお、SQL Anywhere 10ではライセンス体系が変わり、RSAについては標準で利用可能である。

サーバ側の設定

 サーバ側では次のように指定する。

$ dbsrv9 -x tcpip -ec RSA_TLS asademo.db

 -ecオプションでは、表2.6に示す5つの中から、接続を受け入れる通信方式をカンマで区切って列挙する。

表2.6 : 通信方式
通信方式 説明
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"

 クライアント側の設定とサーバ側の設定を照らし合わせ、接続可能な方式がある場合のみ接続が確立する。なお、サーバ証明書を用いて、サーバを認証することも可能だ。

*9
 「簡易的な暗号」とは、カモフラージュ程度の暗号を意味し、素人には解読されない程度のもの。きちんとしたセキュリティを保つには、強度な暗号であるRSAやCerticomを利用する。

次回

 次回は、データベースファイルの再構築やSQL Anywhereのアップデート、サイレントインストールなどについて紹介する。社内評価や開発を目的としたSQL Anywhereの利用であれば、無償のDeveloper Editionを利用できるので、ぜひ一度、実際に試していただきたい。

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
SQL Anywhereの魅力を探る連載記事一覧

もっと読む

この記事の著者

森脇 大悟(モリワキ ダイゴ)

1974年生まれ。神奈川県川崎市出身。京都大学理学部物理学科卒業。同大学院 修士課程中退後、有限会社グルージェント(現・株式会社グルージェント)入社。SIとして金融や物流システムを手がける。2003年アイエニウェア・ソリューションズ株式会社入社。エンジニアとして製品の導入支援やコンサルティング業務に...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1388 2008/09/03 13:59

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング