適用対象:SQL Server
FileTable でファイル システム I/O が動作するしくみについて説明します。
FileTable を使用したファイル I/O API の使用を開始する
FileTable を使用する際、多くの場合は Windows ファイル システムとファイル I/O API が利用されます。 FileTable は、さまざまなファイル I/O API を利用した非トランザクション アクセスをサポートしています。
一般的に、ファイル I/O API は、ファイルまたはディレクトリの論理 UNC パスを取得することによって起動されます。 アプリケーションは、GetFileNamespacePath (Transact-SQL) 関数を含む Transact-SQL ステートメントを使用して、ファイルまたはディレクトリの論理パスを取得できます。 詳しくは、「 Work with Directories and Paths in FileTables」をご覧ください。
次に、この論理パスを使用して、ファイルまたはディレクトリに対するハンドルを取得し、オブジェクトを操作します。 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) を使用する必要があります。 詳細については、「FILESTREAM および FileTable と Always On 可用性グループ (SQL Server)」を参照してください。
部分更新
FileTable 内の FILESTREAM データ用に GetFileNamespacePath (Transact-SQL) 関数を使用して取得された書き込み可能なハンドルは、FILESTREAM コンテンツのインプレース部分更新を実行するために使用できます。 この操作は、トランザクション FILESTREAM アクセスとは異なります。トランザクション FILESTREAM アクセスでは、 OpenSQLFILESTREAM() を呼び出して明示的なトランザクション コンテキストを渡すことによって取得されたハンドルが使用されます。
トランザクション セマンティクス
ファイル I/O API を使用して FileTable 内のファイルにアクセスする場合、このような操作はユーザー トランザクションと関連付けされず、次のような特徴を持ちます。
FileTable 内の FILESTREAM データの非トランザクション アクセスは、いずれのトランザクションにも関連付けられていないため、特定の分離セマンティクスがありません。 ただし、SQL Server では内部トランザクションを使用して、FileTable データに対してロックまたはコンカレンシーのセマンティクスを適用することができます。 このタイプの内部トランザクションは、すべて READ COMMITTED 分離によって実行されます。
FILESTREAM データの非トランザクション操作に対する ACID 保証はありません。 一貫性の保証は、ファイル システム内のアプリケーションで行われるファイル更新の場合と類似します。
このような変更はロールバックできません。
ただし、FileTable 内の FILESTREAM 列は、 OpenSqlFileStream()の呼び出しによるトランザクション FILESTREAM アクセスによって、アクセスすることもできます。 この種のアクセスは完全にトランザクション対応が可能であり、現在サポートされているすべてのトランザクション整合性レベルに一貫して準拠します。
同時実行制御
SQL Server では、ファイル システム アプリケーション間の FileTable アクセス、およびファイル システム アプリケーションと Transact-SQL アプリケーション間の FileTable アクセスに対して、コンカレンシー制御が適用されます。 このコンカレンシー制御は、FileTable の行に適切なロックを設定することによって実現されます。
トリガー
ファイル システムを利用して、ファイルまたはディレクトリ、あるいはその属性の作成、変更、または削除を行うと、FileTable 内で対応する挿入操作、更新操作、または削除操作が実行されます。 そのような操作の中で、関連する Transact-SQL DML トリガーが起動されます。
FileTable でサポートされているファイル システム機能
| 能力 | サポートされています | コメント |
|---|---|---|
| Oplocks | はい | レベル 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 の変更の追跡機能を使用して、同様の情報をキャプチャします。 |