ファイル I/O API を使用した FileTable へのアクセス

適用対象:SQL Server

FileTable でファイル システム I/O が動作するしくみについて説明します。

FileTable でのファイル I/O API の使用

FileTable を使用する際、多くの場合は Windows ファイル システムとファイル I/O API が利用されます。 FileTable は、さまざまなファイル I/O API を利用した非トランザクション アクセスをサポートしています。

  1. 一般的に、ファイル I/O API は、ファイルまたはディレクトリの論理 UNC パスを取得することによって起動されます。 アプリケーションでは、 GetFileNamespacePath (Transact-SQL) 関数と共に Transact-SQL ステートメントを使用して、ファイルまたはディレクトリの論理パスを取得できます。 詳しくは、「 Work with Directories and Paths in FileTables」をご覧ください。

  2. 次に、この論理パスを使用して、ファイルまたはディレクトリに対するハンドルを取得し、オブジェクトを操作します。 CreateFile()、CreateDirectory() など、サポート対象のファイル システム API 関数にパスを渡して、ファイルを作成したり、開いたり、ハンドルを取得したりできます。 そのハンドルを使用することで、データのストリーミング、ディレクトリの列挙と編成、ファイル属性の取得と設定、ファイルまたはディレクトリの削除などの操作を実行できます。

FileTable でのファイルおよびディレクトリの作成

ファイル I/O API (CreateFile、CreateDirectory など) を呼び出すことで、FileTable にファイルまたはディレクトリを作成できます。

  • すべての CREATION_DISPOSITION フラグ、共有モード、およびアクセス モードがサポートされています。 これには、ファイルの作成、削除、およびインプレース変更が含まれます。 さらに、ディレクトリの作成と削除、名前の変更、移動の操作など、ファイル名前空間の更新もサポートされています。

  • 新しいファイルまたはディレクトリの作成は、基になる FileTable 内での新しい行の作成に対応します。

  • ファイルの場合、ストリーム データが file_stream 列に格納されます。ディレクトリの場合、この列は null になります。

  • ファイルの場合、 is_directory 列に falseが格納されます。 ディレクトリの場合、この列に trueが格納されます。

  • 複数の同時ファイル I/O 操作または Transact-SQL 操作が階層内の同じファイルまたはディレクトリに影響を与える場合、アクセスの共有とコンカレンシーが適用されます。

FileTable 内のファイルおよびディレクトリの読み取り

ストリームおよび属性データに対するすべてのファイル I/O アクセス操作に、 SQL Server の Read Committed 分離セマンティクスが適用されます。

FileTable 内のファイルおよびディレクトリへの書き込みおよび更新

  • FileTable に対するファイル I/O 書き込み操作または更新操作は、すべて非トランザクションです。 つまり、これらの操作にバインドされている SQL Server トランザクションは存在せず、ACID 保証はありません。

  • FileTable に対するすべてのファイル I/O ストリーミング/インプレース更新がサポートされます。

  • ファイル I/O API を介して FILESTREAM のデータまたは属性を更新すると、FileTable 内の対応する file_stream および対応するファイル属性列が更新されます。

FileTable 内のファイルおよびディレクトリの削除

ファイルまたはディレクトリを削除すると、Windows ファイル I/O API のすべてのセマンティクスが適用されます。

  • ディレクトリにファイルまたはサブディレクトリが含まれる場合、そのディレクトリの削除は失敗します。

  • ファイルまたはディレクトリを削除すると、対応する行が FileTable から削除されます。 これは、Transact-SQL 操作を使用して行を削除することと同じです。

サポートされているファイル システム操作

FileTable は、以下のファイル システム操作に関連するファイル システム API をサポートしています。

  • ディレクトリ管理

  • ファイル管理

FileTable は、以下の操作をサポートしていません。

  • ディスク管理

  • ボリューム管理

  • トランザクション NTFS

FileTable へのファイル I/O アクセスに関するその他の注意点

Always On 可用性グループでの仮想ネットワーク名 (VNN) の使用

FILESTREAM データまたは FileTable データを格納するデータベースが Always On 可用性グループに属する場合、ファイル システム API を介した FILESTREAM データまたは FileTable データへのすべてのアクセスではコンピューター名ではなく仮想ネットワーク名 (VNN) を使用する必要があります。 詳細については、「ALWAYS ON 可用性グループを含む FILESTREAM と FileTable (SQL Server)」を参照してください。

部分更新

GetFileNamespacePath (Transact-SQL) 関数を使用して FileTable 内の FILESTREAM データに対して取得された書き込み可能なハンドルを使用すると、FILESTREAM コンテンツをインプレースで部分的に更新できます。 この操作は、トランザクション FILESTREAM アクセスとは異なります。トランザクション FILESTREAM アクセスでは、 OpenSQLFILESTREAM() を呼び出して明示的なトランザクション コンテキストを渡すことによって取得されたハンドルが使用されます。

トランザクション セマンティクス

ファイル I/O API を使用して FileTable 内のファイルにアクセスする場合、このような操作はユーザー トランザクションと関連付けされず、次のような特徴を持ちます。

  • FileTable 内の FILESTREAM データの非トランザクション アクセスは、いずれのトランザクションにも関連付けられていないため、特定の分離セマンティクスがありません。 ただし、SQL Server では内部トランザクションを使用して、FileTable データに対してロックまたはコンカレンシーのセマンティクスを適用することができます。 このタイプの内部トランザクションは、すべて READ COMMITTED 分離によって実行されます。

  • FILESTREAM データの非トランザクション操作に対する ACID 保証はありません。 一貫性の保証は、ファイル システム内のアプリケーションで行われるファイル更新の場合と類似します。

  • このような変更はロールバックできません。

ただし、FileTable 内の FILESTREAM 列は、 OpenSqlFileStream() の呼び出しによるトランザクション FILESTREAM アクセスによって、アクセスすることもできます。 この種のアクセスは完全にトランザクション アクセスであり、現在サポートされている全レベルのトランザクション一貫性を保持します。

同時実行制御

SQL Serverでは、ファイル システム アプリケーション間、およびファイル システム アプリケーションと Transact-SQL アプリケーション間の FileTable アクセスのコンカレンシー制御が適用されます。 このコンカレンシー制御は、FileTable の行に適切なロックを設定することによって実現されます。

トリガー

ファイル システムを利用して、ファイルまたはディレクトリ、あるいはその属性の作成、変更、または削除を行うと、FileTable 内で対応する挿入操作、更新操作、または削除操作が実行されます。 関連付けられている Transact-SQL DML トリガーは、これらの操作の一部として発生します。

FileTable でサポートされているファイル システム機能

機能 サポートされています 説明
oplock はい レベル 2、レベル 1、バッチ、およびフィルターの各 oplock がサポートされます。
拡張属性 いいえ
再解析ポイント いいえ
永続的 ACL いいえ
名前付きストリーム いいえ
スパース ファイル はい スパースかどうかはファイルにのみ設定できます。この設定はデータ ストリームの記憶域に影響します。 FILESTREAM データは NTFS ボリュームに格納されるため、FileTable 機能では NTFS ファイル システムに要求を転送することによってスパース ファイルをサポートします。
圧縮 はい
暗号化 はい
TxF いいえ
ファイル ID いいえ
オブジェクト ID いいえ
シンボリック リンク いいえ
ハード リンク いいえ
短い名前 いいえ
ディレクトリ変更の通知 いいえ
バイト範囲ロック はい バイト範囲ロックの要求は、NTFS ファイル システムに渡されます。
メモリ マップ ファイル いいえ
キャンセル I/O はい
Security いいえ Windows 共有レベルのセキュリティと SQL Server のテーブルおよび列レベルのセキュリティが適用されます。
USN ジャーナル いいえ FileTable 内のファイルおよびディレクトリに対するメタデータの変更は、 SQL Server データベースの DML 操作です。 したがって、これらの操作は対応するデータベース ログ ファイルに記録されます。 ただし、(サイズの変更を除き) NTFS USN ジャーナルには記録されません。

SQL Server の変更の追跡機能を使用して、同様の情報をキャプチャします。

参照

FileTable へのファイルの読み込み
FileTable 内のディレクトリとパスの操作
Transact SQL を使用した FileTable へのアクセス
FileTable DDL、関数、ストアド プロシージャ、およびビュー