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からアクセスするというのがより妥当な構成であろう。
FileMaker Server 8 Advanced上で共有されているデータベースの名前をNorthwindとする。最初にこのデータベースへODBC経由で接続できるようにする。
以下の準備が必要である。
Fig.1 Enabling ODBC connections via FileMaker Server Admin program.
Fig.2 Defining a new privilege set that allows only minimum access through ODBC/JDBC connection.
Fig.3 Defining a new user account that we are going to use for authentication at
the time of ODBC connection.
以上で設定は終わりである。FileMakerのNorthwindデータベースにSampleTableという名のテーブルを作成し、テキスト、数字、日付、時刻、および、タイムスタンプの5種類のフィールドタイプのフィールドを定義する。それらの値が正常にSQL Server側で使用できるかを確認してみることにした。SampleTableテーブルのフィールド定義は以下の通りである。
Fig 9. Schema of
'SampleTable' table defined within the 'Northwind' FileMaker database.
Microsoft SQL Server Management Studioでクエリウインドウを開き、適当なデータベースに対し以下のSQLを実行してみた。
SELECT * FROM OPENQUERY(NORTHWIND, 'SELECT * FROM SampleTable')
クエリ内のOPENQUERYの第1引数は使用するリンクサーバーの名前である。結果はFig.10のようになった。
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社のサポートに問い合わせてください。)
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.
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 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
Fig. 12 Result of a SQL query using INNER JOIN
statement