SQL Server 2005からFileMakerのデータベースにアクセスする方法について

Introduction

SQL Server 2005が持つリンクサーバー(Linked Server)の機能を使えばFileMaker Server 8 Advancedで共有されているデータベースにSQL Server 2005からアクセスすることができる。以下ではその手順について解説する。
SQL Serverを運用している環境にわざわざFileMaker Serverも並行して運用する必要性はないといえばないのだが、実際には諸般の理由からデータが分散してしまうということも起こり得る。FileMakerの使い勝手の良さは群を抜いているために現場の担当者に気に入られすぎ、一部のデータの移行がままならないといった困った状況になることもあるだろう。データの堅牢性のことを思えばせっかくSQL Serverがあるのなら重要なデータはすべてSQL Serverへ移行すべきであるが、社員名簿のように変更がそれほど頻繁でなくデータが消えても作り直せるデータならFileMaker Serverで運用するということもあり得るだろう。ちなみにFileMaker Server 9以降ではFileMaker側からSQLデータソースにリンクできるので、データをSQL Serverに置いてFileMakerからアクセスするというのがより妥当な構成であろう。

設定方法

Step 1: ODBC接続設定

FileMaker Server 8 Advanced上で共有されているデータベースの名前をNorthwindとする。最初にこのデータベースへODBC経由で接続できるようにする。
以下の準備が必要である。

Allow ODBC connections
Fig.1 Enabling ODBC connections via FileMaker Server Admin program.

Define a new privilege set for ODBC connections
Fig.2 Defining a new privilege set that allows only minimum access through ODBC/JDBC connection.

Defining a new user account
Fig.3 Defining a new user account that we are going to use for authentication at the time of ODBC connection.

  1. 準備ができたらSQL Serverが動作するコンピュータ上で、Control Panel→Administrative Tools→Data Sources (ODBC) を開き、System DSNタブを選択する(下図)。
    System DSN
    Fig.4 Adding System Data Source
  2. Add...ボタンをクリックする。
  3. DataDirect 32-BIT SequeLink 5.4を選択してFinishボタンをクリックする(下図)
    DataDirect 32-BIT SequeLink
    Fig. 5 Selecting DataDirect 32-BIT SequeLink ODBC driver
  4. データソース名をNorthwindとし、その他も下図のように入力する。SequeLink Server HostにはFileMaker ServerのIPアドレスを入れる。SQL ServerとFileMaker Serverが同じサーバー上で動いている場合はlocalhostと入力してもよい。
    DataDirect SequeLink for ODBC Setup
    Fig. 6 Setting up ODBC connection information for the Northwind database hosted on the FileMaker Server
  5. 「Test Connect」ボタンをクリックするとユーザー名とパスワードを聞いてくるので、先にNorthwindファイルで定義したユーザー名(ODBCUser)とパスワードを入力し、正常に接続できることを確認する。
  6. OKをクリックする。System Data Sourcesの一覧にNorthwindが追加されているのを確認しOKをクリックする。
    System DSN

Step 2: リンクサーバーの作成

  1. Microsoft SQL Server Management Studioを起動し、SQL Server 2005に接続する。
  2. Server Objectsコンテナを開きその中のLinked Serversコンテナを右ボタンクリックする。表示されるコンテキストメニューからNew Linked Server…を選択する。
  3. Linked Server名をNORTHWINDとする。
  4. Providerで[Microsoft OLE DB Provider for ODBC drivers]を選択し、Data SourceにNorthwindを入力、Product nameは適当に入力する。
    New Linked Server
    Fig.7 Defining a new Linked Server
  5. Securityページを選択する。
  6. Be made using this security contextラジオボタンを選択し、Northwindデータベースとの接続に使用するFileMakerのユーザーアカウント名(ODBCUser)とパスワードを入力する(下図)。
    Security Options
    Fig. 8 Setting up Security Options
  7. OKボタンをクリックする。

検証

以上で設定は終わりである。FileMakerのNorthwindデータベースにSampleTableという名のテーブルを作成し、テキスト、数字、日付、時刻、および、タイムスタンプの5種類のフィールドタイプのフィールドを定義する。それらの値が正常にSQL Server側で使用できるかを確認してみることにした。SampleTableテーブルのフィールド定義は以下の通りである。

Definition of SampleTable
Fig 9. Schema of 'SampleTable' table defined within the 'Northwind' FileMaker database.

Test 1: 単純SELECT文

Microsoft SQL Server Management Studioでクエリウインドウを開き、適当なデータベースに対し以下のSQLを実行してみた。
SELECT * FROM OPENQUERY(NORTHWIND, 'SELECT * FROM SampleTable')
クエリ内のOPENQUERYの第1引数は使用するリンクサーバーの名前である。結果はFig.10のようになった。

Result of SELECT statement
Fig. 10 Result of SELECT query using OPENQUERY

何の問題もなく実行できているように見えるが、実はテキストタイプのフィールドについては条件があることがわかった。テキストタイプのフィールドに対しては入力値の制限オプションで
 ・ 入力値の制限を「常時」にする
 ・ 最大文字数を指定する
の2つの設定を行わないとなぜかSQL Serverでのクエリ実行時にエラーになるのである。その時のエラーメッセージは以下のようなものであった:
Cannot get the current row value of column "[MSDASQL].CustomerName" from OLE DB provider "MSDASQL" for linked server "NORTHWIND".
他には時刻フィールドの値は日付部分が1900年1月1日となるが、元々の日付の情報がないのだから当然と言えよう。

(FileMaker Server 8v4 Updaterを適用すると日付フィールドの値をODBC経由で正しく得られなくなることがあります。現象が発生した場合はFileMaker社のサポートに問い合わせてください。)

Requirement for text field
Fig. 11 You need to configure both [Validate data in this field: Always] and [Maximum number of characters] settings in the Validation options tab of the Text-type field.  Otherwise the values won't be passed to SQL Server successfully.

Test 2: INSERT INTOを使った取り込み

SQL Server側にEmployeesという名のテーブルを作成し、SampleTableからIDだけを取りこんだ。以下がその時のSQLである。
CREATE TABLE dbo.Employees (EmployeeID int)
GO
INSERT INTO dbo.Employees (EmployeeID) SELECT ID FROM OPENQUERY(NORTHWIND, 'SELECT ID FROM SampleTable')
GO

Test 3: INNER JOINの使用

Test 2で作成したEmployeesテーブルとSampleTableとのINNER JOINも問題なく実行できた。(ただし、レコード数が膨大な場合にどのくらいのパフォーマンスが得られるかまではテストしていない。)
SELECT e.EmployeeID, s.CustomerName FROM dbo.Employees AS e
INNER JOIN OPENQUERY(NORTHWIND, 'SELECT ID, CustomerName FROM SampleTable') AS s ON e.EmployeeID = s.ID

Result of INNER JOIN
Fig. 12 Result of a SQL query using INNER JOIN statement

資料室へ戻る