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

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

このトピックの内容

実行する操作

  • FileTable 内のディレクトリとパスの操作

  • 相対パスを使用した移植可能なコードの実現

詳細情報

  • 重要な制限

    • 入れ子のレベル

    • 完全なパス名の長さ

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

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

  • FileTable スキーマの is_directory 列

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

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

次の 3 つの関数を使用して、Transact-SQL で FileTable ディレクトリを操作することができます。

目的

使用する関数

特定の 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

<値>

アイテムはファイルを表します。

TRUE

NULL

アイテムはディレクトリを表します。

TRUE

<値>

これは、システム定義の制約によってキャッチされる無効な組み合わせです。

[先頭に戻る]

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

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

[先頭に戻る]

関連項目

概念

FileTable の前提条件の有効化

FileTable の作成、変更、および削除

Transact SQL を使用した FileTable へのアクセス

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