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 でのファイルとディレクトリの作成
ファイルまたはディレクトリは、CreateFile や CreateDirectory などのファイル I/O API を呼び出すことによって FileTable に作成できます。
すべての作成処理フラグ、共有モード、およびアクセス モードがサポートされています。 これには、ファイルの作成、削除、インプレース変更が含まれます。 また、ファイル名前空間の更新 (ディレクトリの作成/削除、名前の変更、移動操作など) もサポートされています。
新しいファイルまたはディレクトリの作成は、基になる FileTable での新しい行の作成に対応します。
ファイルの場合、ストリーム データは file_stream 列に格納されます。ディレクトリの場合、この列は null です。
ファイルの場合、 is_directory 列には false が含まれます。 ディレクトリの場合、この列には true が含まれます。
複数の同時ファイル I/O 操作または Transact-SQL 操作が階層内の同じファイルまたはディレクトリに影響を与える場合、アクセスの共有とコンカレンシーが適用されます。
FileTable でのファイルとディレクトリの読み取り
読み取りコミット済み分離セマンティクスは、ストリームおよび属性データに対するすべてのファイル I/O アクセス操作に対して SQL Server で適用されます。
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 アクセスに関するその他の考慮事項
AlwaysOn 可用性グループでの仮想ネットワーク名 (VNN) の使用
FILESTREAM または FileTable データを含むデータベースが AlwaysOn 可用性グループに属している場合、ファイル システム API を介して FILESTREAM または FileTable データにアクセスするには、コンピューター名の代わりに VNN を使用する必要があります。 詳細については、「 FILESTREAM と FileTable with AlwaysOn 可用性グループ (SQL Server)」を参照してください。
部分的な更新
GetFileNamespacePath (Transact-SQL) 関数を使用して FileTable 内の FILESTREAM データに対して取得された書き込み可能なハンドルを使用すると、FILESTREAM コンテンツをインプレースで部分的に更新できます。 この動作は、 OpenSQLFILESTREAM() を呼び出して明示的なトランザクション コンテキストを渡すことによって取得されたハンドルを介したトランザクション FILESTREAM アクセスとは異なります。
トランザクション セマンティクス
ファイル I/O API を使用して FileTable 内のファイルにアクセスする場合、これらの操作はユーザー トランザクションに関連付けされず、次の追加の特性があります。
FileTable 内の FILESTREAM データへの非トランザクション アクセスはトランザクションに関連付けられていないため、特定の分離セマンティクスはありません。 ただし、SQL Server では内部トランザクションを使用して、FileTable データにロックまたはコンカレンシー セマンティクスを適用できます。 この種類の内部トランザクションは、リードコミット分離レベルで実行されます。
FILESTREAM データに対するこれらの非トランザクション操作に対する ACID の保証はありません。 整合性の保証は、ファイル システム内のアプリケーションによって行われたファイル更新の場合と似ています。
これらの変更をロールバックすることはできません。
ただし、 OpenSqlFileStream() を呼び出すことで、FileTable 内の FILESTREAM 列にトランザクション FILESTREAM アクセスを使用してアクセスすることもできます。 この種のアクセスは完全にトランザクション可能であり、現在サポートされているトランザクションのすべてのレベルを一貫して優先します。
同時実行制御
SQL Server では、ファイル システム アプリケーション間、およびファイル システム アプリケーションと Transact-SQL アプリケーション間の FileTable アクセスのコンカレンシー制御が適用されます。 このコンカレンシー制御は、FileTable 行に適切なロックを設定することによって実現されます。
トリガー (条件や動作を引き起こすもの)
ファイル システムを使用してファイルまたはディレクトリまたはその属性を作成、変更、または削除すると、FileTable での対応する挿入、更新、または削除操作が行われます。 関連付けられている Transact-SQL DML トリガーは、これらの操作の一環として発動されます。
FileTable でサポートされているファイル システム機能
能力 | サポートされています | コメント |
---|---|---|
Oplocks | イエス | レベル 2、レベル 1、バッチ、フィルターの操作がサポートされています。 |
拡張属性 | いいえ | |
ポイントの再解析 | いいえ | |
永続的 ACL | いいえ | |
名前付きストリーム | いいえ | |
スパース ファイル | イエス | スパースはファイルにのみ設定でき、データ ストリームのストレージに影響します。 FILESTREAM データは NTFS ボリュームに格納されるため、FileTable 機能では、要求を NTFS ファイル システムに転送することでスパース ファイルがサポートされます。 |
圧縮 | イエス | |
Encryptiion | イエス | |
TxF | いいえ | |
ファイル ID | いいえ | |
オブジェクト ID | いいえ | |
シンボリック リンク | いいえ | |
ハード リンク | いいえ | |
短い名前 | いいえ | |
ディレクトリ変更通知 | いいえ | |
バイト範囲のロック | イエス | バイト範囲ロックの要求は NTFS ファイル システムに渡されます。 |
メモリ マップファイル | いいえ | |
I/O の取り消し | イエス | |
セキュリティ | いいえ | Windows 共有レベルのセキュリティと SQL Server テーブルと列レベルのセキュリティが適用されます。 |
USN ジャーナル | いいえ | FileTable 内のファイルとディレクトリに対するメタデータの変更は、SQL Server データベースに対する DML 操作です。 そのため、これらは対応するデータベース ログ ファイルに記録されます。 ただし、NTFS USN ジャーナルには記録されません (サイズの変更を除く)。 SQL Server の変更追跡機能を使用して、同様の情報をキャプチャできます。 |
こちらもご覧ください
FileTable にファイルを読み込む
FileTable のディレクトリとパスを操作する
Transact-SQL を使用して FileTable にアクセスする
FileTable DDL、関数、ストアド プロシージャ、およびビュー