はじめに
SQL Server 2012には、開発効率を向上させるための機能が追加されています。例えば、バイナリファイルの管理・使用が容易になるFileTable機能です。以前のバージョンで提供されていたFileStreamをベースにしており、より使いやすくなっています。列の属性でしか提供されていなかった採番機能が、テーブルから独立したシーケンスオブジェクトが提供されることで、ストアドプロシージャからの利用できるようになり、自動採番機能の使用範囲が広がります。また、アプリケーション側で実装してきたページング機能が、データベース機能として提供されるようになりました。
今回はこれらの便利な新機能について、詳しく紹介していきます。
対象読者
- SQL Serverを使用するアプリケーション設計、開発者
- SQL Serverデータベース管理者
- SQL Server 2012の新機能に興味のある方
バイナリデータの管理がエクスプローラでできる - FileTable -
SQL Server 2012では、画像やパワーポイント、エクセルなどのバイナリファイルをデータベース上で効率良く管理するために、新たにFileTable機能が追加されました。SQL Server 2008から提供されているFileStreamという機能をベースにしています。
FileTable機能が追加された背景
FileStreamは、バイナリファイル管理の問題点を解消するために提供された機能でした。FileStreamが提供されるまでのバイナリファイルの管理方法には、ファイルパスを格納する方法とバイナリファイル自体を格納する方法がありました(図1)。
ファイルパスを管理する方法は、SQL Serverからバイナリファイルを管理できません。そのため、バイナリファイルが削除されたり、移動されたりすると、管理しているファイルパスと矛盾することがあります。また、バイナリファイル自体を格納する方法は、参照/更新性能が低かったり、ストリーミングなど一部機能が使用できないという問題がありました。
FileStreamは、SQL ServerとWindowsのファイルシステムを結合し、Windowsのファイルを直接SQL Serverへ格納できるようになりました(図2)。SQL Serverのプロセス管理下にありつつ、SQL Serverのデータベースファイル内では無く、Windowsファイルストレージに直接格納します。T-SQLでバイナリデータの挿入、更新、検索もでき、Win32ファイルシステムインターフェイスでもデータアクセスができます。
SQL Server 2012で追加されたFileTableは、FileStreamの使用しづらかった点を改善した機能です。FileStreamにファイルを登録するには、Win32 APIを使用するか、T-SQLを発行する必要がありました。しかし、FileTableでは、Windowsファイル名前空間をサポートすることで、Windowsアプリケーションとの互換性が向上しています。Windowsファイル名前空間をサポートされたことで、エクスプローラからファイルのツリー階層を確認したり、アプリケーションからファイルパスを指定してファイルにアクセスできるようになります。ファイルのアクセスパスは、T-SQLを発行して取得できます。
FileTableを使用するための手順
FileTableを使用するには、FileStreamを有効化し、FileTable用の設定を有効化します。FileStreamを有効化するには、インスタンスレベルでの有効化とデータベースレベルでの有効化が必要です(注1)。
SQL Server 2012のインストール時に、ウィザード内でインスタンスレベルのFileStreamを有効にできます。インストール時に有効化している場合は、インスタンスレベルの有効化作業は必要ありません。
1)インスタンスレベルでFileStreamを有効化する
[スタート]-[すべてのプログラム]-[Microsoft SQL Server 2012]-[構成ツール]からSQL Server構成マネージャを起動します。左側のメニューツリーから[SQL Serverのサービス]を選択します。サービス一覧から有効化したいインスタンスをダブルクリックしてプロパティウィンドウを開きます。プロパティウィンドウの[FileStream]タブを選択します。[Transact-SQLアクセスに対してFILESTREAMを有効にする][ファイルI/Oアクセスに対してFILESTREAMを有効にする]にチェックを入れます(図3)。
[スタート]-[すべてのプログラム]-[Microsoft SQL Server 2012]からSQL Server Management Studioを起動し、SQL Server構成マネージャでFileStreamを有効化したインスタンスに接続します。オブジェクトエクスプローラのインスタンスで右クリックをして、コンテキストメニューから[プロパティ]を選択すると、[サーバーのプロパティ]が表示されます。左側メニューから[詳細設定]を選択し、[FILESTREAMアクセスレベル]を[有効なフルアクセス]を選択します(図4)。
2)FileStreamを有効にしたデータベースを作成する
[スタート]-[すべてのプログラム]-[Microsoft SQL Server 2012]からSQL Server Management Studioを起動し、FileStreamをインスタンスレベルで有効化したSQL Serverインスタンスに接続し、オブジェクトエクスプローラの[データベース]で右クリックをして、コンテキストメニューから[新しいデータベース]を選択すると、[新しいデータベース]ウィンドウが表示されます。左側メニューから[ファイルグループ]を選択し、下側の[追加]ボタンをクリックします。名前に任意の文字列を入力します(図5)。
左側メニューから[全般]を選択し、[追加]ボタンをクリックします。[ファイルの種類]から[FILESTREAM]を選択し、論理名に任意の文字を入力し(図6)、保存するファイルパスを設定します。
SQL Server 2012では、FileTableを使用するために、FileStreamの設定[FAILESTREAM ディレクトリ名]と[FILESTREAM 非トランザクション アクセス]の2種類の項目が追加されています。左側メニューから[オプション]を選択し、[FILESTREAMディレクトリ名]に任意の文字列(本稿では、testを使用します)を入力、[FILESTREAM非トランザクションアクセス]をFullにして(図7)データベースを作成します。
3)FileTableを作成する
FileTableは、FILESTREAMデータやファイル、ディレクトリなどの情報を格納する固定スキーマを含んだ特殊なユーザーテーブルです。FileTableテーブルは固定された定義があるため、作成時に列を指定することはできません。
FileTableを作成するために[リスト1]のクエリを実行します。FileTableを作成するには、1行目のように、「AS FILETABLE」オプションを付与します。
2行目の「FILETABLE_DIRECTORY」は、FileTableのルートディレクトリのディレクトリ名です。ルートディレクトリ名はデータベース内のすべてのFileTableディレクトリ名の中で一意にしなければなりません。
3行目の「FILETABLE_COLLATE_FILENAME」は、FileTableのName列の照合順序を指定します。FILETABLE_COLLATE_FILENAMEはオプション扱いになっており、指定しなかったり、database_defaultを設定したりするとデータベースの照合順序が適用されます。FileTableのName列は大文字と小文字を区別しない設定にしなければなりません。データベースの照合順序を大文字と小文字を区別する設定にしている場合は、FILETABLE_COLLATE_FILENAMEで区別しない照合順序を指定しないとエラーになります。「CI」がついている照合順序は大文字と小文字を区別せず、「CS」がついている照合順序は大文字と小文字を区別するため、「CI」がついている照合順序を選択します。
CREATE TABLE FileTable1 AS FILETABLE WITH ( FILETABLE_DIRECTORY = 'FileTable1', FILETABLE_COLLATE_FILENAME = database_default ) GO
クエリを実行すると、FileTablesが作成されます(図8)。