FileTable 内のディレクトリとパスを操作する

適用対象:SQL Server

FileTable 内でファイルが格納されるディレクトリ構造について説明します。

方法: FileTable 内のディレクトリとパスを操作する

Transact-SQL での FileTable ディレクトリの操作には、次の 3 つの関数を使用できます。

目的 使用する関数
特定の FileTable または現在のデータベースの、ルート レベルの UNC パスを取得する。 FileTableRootPath (Transact-SQL)
FileTable 内のファイルまたはディレクトリの絶対 UNC パスまたは相対 UNC パスを取得する。 GetFileNamespacePath (Transact-SQL)
パスを指定して、FileTable 内の指定されたファイルまたはディレクトリのパス ロケーター ID 値を取得する。 GetPathLocator (Transact-SQL)

相対パスを使用して移植可能なコードを実現する

コードとアプリケーションが現在のコンピューターとデータベースから切り離された状態を維持するには、絶対ファイル パスに依存したコードを記述しないでください。 代わりに、以下の例に示すように FileTableRootPath (Transact-SQL) 関数および GetFileNamespacePath (Transact-SQL)関数を併用して、実行時にファイルの完全なパスを取得します。 既定では、GetFileNamespacePath 関数はデータベースのルート パスにあるファイルの相対パスを返します。

USE database_name;

DECLARE @root NVARCHAR(100);
DECLARE @fullpath NVARCHAR(1000);

SELECT @root = FileTableRootPath();

SELECT @fullpath = @root + file_stream.GetFileNamespacePath()
FROM filetable_name
WHERE name = N'document_name';

PRINT @fullpath;
GO

制限事項

入れ子のレベル

重要

FileTable ディレクトリ内には、15 レベルを超えるサブディレクトリを格納できません。 15 レベルのサブディレクトリを格納した場合、最も深いレベルにファイルを置くことはできません。そのファイルが、さらに深いレベルを表すことになるためです。

完全なパス名の長さ

重要

NTFS ファイル システムは、Windows シェルおよび大部分の Windows API の上限である 260 文字よりも長いパス名をサポートします。 そのため、Transact-SQL を使用して、完全なパス名が 260 文字を超えているために Windows エクスプローラーや他の多くの Windows アプリケーションで表示したり開いたりできないファイルを、FileTable のファイル階層内に作成できます。 ただし、Transact-SQL を使用してこれらのファイルに引き続きアクセスできます。

FileTable に格納されているアイテムへの完全なパス

FileTable 内のファイルまたはディレクトリへの完全なパスには、次の要素が先頭に付きます。

  1. SQL Server インスタンス レベルでの FILESTREAM ファイル I/O アクセスが有効になっている共有。

  2. データベース レベルで指定された DIRECTORY_NAME

  3. FileTable レベルで指定された FILETABLE_DIRECTORY

以上を組み合わせた階層は、次のようになります。

\\<machine>\<instance-level FILESTREAM share>\<database-level directory>\<FileTable directory>\

このディレクトリ階層は、FileTable のファイル名前空間のルートを構成します。 このディレクトリ階層の下に、FileTable の FILESTREAM データがファイルとして格納されます。また、サブディレクトリとしても格納され、そこにもファイルおよびサブディレクトリを格納できます。

インスタンス レベルの FILESTREAM 共有の下に作成されたディレクトリ階層は仮想ディレクトリ階層であることに注意してください。 この階層は SQL Server データベースに格納され、NTFS ファイル システムでは物理的に表示されません。 FILESTREAM 共有の下にあるファイルおよびディレクトリ、および FILESTREAM 共有に含まれる FileTables 内のファイルおよびディレクトリにアクセスするすべての操作は、ファイル システムに埋め込まれた SQL Server コンポーネントによってインターセプトされ、処理されます。

インスタンス レベル、データベース レベル、および FileTable レベルのルート ディレクトリのセマンティクス

このディレクトリ階層は次のセマンティクスに従います。

  • インスタンス レベルの FILESTREAM 共有は管理者によって構成され、サーバーのプロパティとして格納されます。 この共有の名前は、SQL Server 構成マネージャーを使用して変更できます。 名前変更の操作は、サーバーを再起動するまで有効になりません。

  • 新しいデータベースを作成した場合、データベース レベルの DIRECTORY_NAME は既定で null です。 管理者は ALTER DATABASE ステートメントを使用して、この名前を設定または変更できます。 名前は、インスタンス内で一意であることが必要です (大文字と小文字は区別されません)。

  • 通常、FILETABLE_DIRECTORY 名は FileTable を作成する際に CREATE TABLE ステートメントの中で指定します。 この名前は、ALTER TABLE コマンドを使用して変更できます。

  • ファイル I/O 操作でこれらのルート ディレクトリの名前を変更することはできません。

  • 排他的なファイル ハンドルを使用してこれらのルート ディレクトリを開くことはできません。

FileTable スキーマの is_directory 列

次の表に、is_directory 列と、FileTable の FILESTREAM データを含む file_stream 列との間のやり取りを示します。

is_directory 値 file_stream 値 動作
FALSE NULL これは、システム定義の制約によってキャッチされる無効な組み合わせです。
FALSE <value> アイテムはファイルを表します。
TRUE NULL アイテムはディレクトリを表します。
TRUE <value> これは、システム定義の制約によってキャッチされる無効な組み合わせです。

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

FILESTREAM データまたは FileTable データを含むデータベースが可用性グループに属する場合、次の処理が行われます。