Work with Directories and Paths in FileTables
FileTable 内でファイルが格納されるディレクトリ構造について説明します。
方法: 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 内のファイルまたはディレクトリへの完全なパスには、次の要素が先頭に付きます。
SQL Server インスタンス レベルでの FILESTREAM ファイル I/O アクセスが有効になっている共有。
データベース レベルで指定された DIRECTORY_NAME 。
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 value | file_stream value | 動作 |
FALSE | NULL | これは、システム定義の制約によってキャッチされる無効な組み合わせです。 |
FALSE | <value> | アイテムはファイルを表します。 |
TRUE | NULL | アイテムはディレクトリを表します。 |
TRUE | <value> | これは、システム定義の制約によってキャッチされる無効な組み合わせです。 |
AlwaysOn 可用性グループでの仮想ネットワーク名 (VNN) の使用
FILESTREAM データまたは FileTable データを格納するデータベースが AlwaysOn 可用性グループに属する場合、次の処理が行われます。
FILESTREAM および FileTable 関数は、コンピューター名ではなく仮想ネットワーク名 (VNN) のやり取りを行います。 関数の詳細については、「Filestream および FileTable 関数 (Transact-SQL)」を参照してください。
ファイル システム API を介した FILESTREAM または FileTable データへのすべてのアクセスでは、コンピューター名ではなく VNN を使用する必要があります。 詳細については、「 FILESTREAM と FileTable with AlwaysOn 可用性グループ (SQL Server)」を参照してください。
参照
FileTable の前提条件の有効化
FileTable の作成、変更、および削除
Transact SQL を使用した FileTable へのアクセス
ファイル I/O API を使用した FileTable へのアクセス