次の方法で共有


FileTable を作成、変更、または削除する

適用対象:SQL Server

新しい FileTable の作成や、既存の FileTable の変更または削除を行う方法について説明します。

FileTable を作成する

FileTable は、定義済みの固定スキーマを持つ特殊なユーザー テーブルです。 このスキーマは、FILESTREAM データ、ファイルとディレクトリの情報、およびファイルの属性を格納します。 FileTable スキーマの詳細については、「 FileTable Schema」を参照してください。

Transact-SQL または SQL Server Management Studio を使用して、新しい FileTable を作成することができます。 FileTable には固定スキーマがあるため、列の一覧を指定する必要はありません。 FileTable を作成するため、簡単な構文を指定することができます。

  • ディレクトリ名。 FileTable フォルダー階層において、このテーブル レベルのディレクトリは、データベース レベルで指定されたデータベース ディレクトリの子になると同時に、テーブルに格納されるファイルまたはデータベースの親になります。

  • FileTable の Name 列のファイル名に使用する照合順序の名前。

  • 自動的に作成される 3 つの主キーと一意の制約で使用する名前。

Transact-SQL を使用して FileTable を作成する

オプションを指定して AS FILETABLE ステートメントを呼び出して FileTable を作成します。 FileTable には固定スキーマがあるため、列の一覧を指定する必要はありません。 新しい FileTable には次の設定を指定できます。

  1. FILETABLE_DIRECTORY。 FileTable に格納されたすべてのファイルおよびディレクトリのルート ディレクトリとなるディレクトリを指定します。 この名前は、データベース内のすべての FileTable ディレクトリ名の中で一意である必要があります。 一意性の比較では、現在の照合順序の設定とは関係なく、大文字と小文字は区別されません。

    • この値のデータ型は nvarchar(255) で、 Latin1_General_CI_AS_KS_WSの固定照合順序を使用します。

    • 指定するディレクトリ名は、ファイル システムの有効なディレクトリ名に関する要件を満たしている必要があります。

    • この名前は、データベース内のすべての FileTable ディレクトリ名の中で一意である必要があります。 一意性の比較では、現在の照合順序の設定とは関係なく、大文字と小文字は区別されません。

    • FileTable の作成時にディレクトリ名を指定しない場合は、FileTable 自体の名前がディレクトリ名として使用されます。

  2. FILETABLE_COLLATE_FILENAME。 FileTable の Name 列に適用する照合順序の名前を指定します。

    1. 指定した照合順序は、Windows のファイル名のセマンティクスに準拠するために、 大文字と小文字を区別しない 設定にする必要があります。

    2. FILETABLE_COLLATE_FILENAMEの値を指定しない場合、またはdatabase_defaultを指定した場合、列は現在のデータベースの照合順序を継承します。 現在のデータベースの照合順序が大文字・小文字を区別する場合には、エラーが発生し、CREATE TABLE 操作が失敗します。

  3. 自動的に作成される 3 つの主キーと一意の制約で使用する名前を指定することもできます。 名前を指定しない場合、この記事で後述するように、システムによって名前が生成されます。

    • FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME
    • FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME
    • FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME

例示

次の例では、新しい FileTable を作成し、 FILETABLE_DIRECTORYFILETABLE_COLLATE_FILENAMEの両方のユーザー定義値を指定します。

CREATE TABLE DocumentStore AS FILETABLE
WITH (
    FILETABLE_DIRECTORY = 'DocumentTable',
    FILETABLE_COLLATE_FILENAME = database_default
);
GO

次の例も、新しい FileTable を作成するものです。 ユーザー定義の値が指定されていないため、 FILETABLE_DIRECTORY の値は FileTable の名前になり、 FILETABLE_COLLATE_FILENAME の値はdatabase_defaultになり、主キー制約と一意制約はシステムによって生成された名前を受け取ります。

CREATE TABLE DocumentStore AS FILETABLE;
GO

SQL Server Management Studio で FileTable を作成する

オブジェクト エクスプローラーで、選択したデータベースのオブジェクトを展開し、 [テーブル] フォルダーを右クリックして [新しい FileTable]をクリックします。

このオプションを選択すると、新しいスクリプト ウィンドウが開きます。このウィンドウには、FileTable を作成するためにカスタマイズして実行できる Transact-SQL スクリプト テンプレートが含まれています。 [クエリ] メニューの [テンプレート パラメーターの値の指定] オプションを使用すると、スクリプトを簡単にカスタマイズできます。

FileTable を作成するための要件と制限事項

  • 既存のテーブルを FileTable に変換するように変更することはできません。

  • データベース レベルで前もって指定する親ディレクトリには、null ではない値を指定する必要があります。 データベース レベルのディレクトリの指定については、「 FileTable の前提条件を有効にする」を参照してください。

  • FileTable には、FILESTREAM 列が含まれているため、有効な FILESTREAM ファイル グループが必要です。 必要に応じて、FileTable を作成するための CREATE TABLE コマンドの一部として有効な FILESTREAM ファイル グループを指定できます。 ファイル グループを指定しない場合、FileTable はデータベースの既定の FILESTREAM ファイル グループを使用します。 データベースに FILESTREAM ファイル グループがない場合は、エラーが発生します。

  • CREATE TABLE...AS FILETABLE ステートメントの一部としてテーブル制約を作成することはできません。 ただし、後で ALTER TABLE ステートメントを使用して制約を追加できます。

  • tempdb データベースまたは他のシステム データベースには FileTable を作成できません。

  • FileTable を一時テーブルとして作成することはできません。

FileTable を変更する

FileTable には定義済みの固定スキーマがあるため、列を追加または変更することはできません。 ただし、カスタム インデックス、トリガー、制約、およびその他のオプションを FileTable に追加することはできます。

ALTER TABLE ステートメントを使用して、システム定義の制約を含む FileTable 名前空間を有効または無効にする方法については、「FileTable の管理」を参照してください。

Transact-SQL を使用して FileTable のディレクトリを変更する

ALTER TABLE ステートメントを呼び出し、SETFILETABLE_DIRECTORY オプションに有効な新しい値を指定します。

Example

ALTER TABLE filetable_name SET (FILETABLE_DIRECTORY = N'directory_name');
GO

SQL Server Management Studio を使用して FileTable のディレクトリを変更する

オブジェクト エクスプローラーで、FileTable を右クリックし、 [プロパティ] をクリックして、 [テーブルのプロパティ] ダイアログ ボックスを開きます。 [FileTable] ページで、 [FileTable ディレクトリ名]に新しい値を入力します。

FileTable を変更するための要件と制限事項

  • FILETABLE_COLLATE_FILENAMEの値を変更することはできません。

  • FileTable のシステム定義列を変更、削除、または無効にすることはできません。

  • FileTable に新しいユーザー列、計算列、または永続化された計算列を追加することはできません。

FileTable を削除する

DROP TABLE ステートメントの通常の構文を使用して FileTable を削除できます。

FileTable を削除すると、次のオブジェクトも削除されます。

  • FileTable のすべての列に加え、インデックス、制約、トリガーなどテーブルに関連付けられているすべてのオブジェクトが削除されます。

  • FileTable ディレクトリとそのディレクトリに含まれているサブディレクトリは、データベースの FILESTREAM ファイルとディレクトリ階層から消えます。

FileTable のファイル名前空間に開いているファイル ハンドルがある場合、 DROP TABLE コマンドは失敗します。 開いているハンドルを閉じる方法の詳細については、「 FileTable の管理」を参照してください。

FileTable の作成時に他のデータベース オブジェクトが作成される

新しい FileTable を作成すると、システム定義のインデックスと制約もいくつか作成されます。 これらのオブジェクトを変更または削除することはできません。FileTable 自体が削除された場合にのみ消えます。 これらのオブジェクトの一覧を表示するには、カタログ ビュー sys.filetable_system_defined_objectsクエリを実行します。

--View all objects for all filetables, unsorted
SELECT *
FROM sys.filetable_system_defined_objects;
GO

--View sorted list with friendly names
SELECT OBJECT_NAME(parent_object_id) AS 'FileTable',
       OBJECT_NAME(object_id) AS 'System-defined Object'
FROM sys.filetable_system_defined_objects
ORDER BY FileTable, 'System-defined Object';
GO

新しい FileTable の作成時に作成されるインデックス

新しい FileTable を作成すると、次に示すシステム定義のインデックスも作成されます。

インデックスの種類 Clustered
[path_locator] ASC 主キー いいえ
[parent_path_locator] ASC, [name] ASC ユニーク いいえ
[stream_id] ASC ユニーク いいえ

新しい FileTable の作成時に作成される制約

新しい FileTable を作成すると、次に示すシステム定義の制約も作成されます。

制約 強制
次の列の既定の制約

creation_time
is_archive
is_directory
is_hidden
is_offline
is_readonly
is_system
is_temporary
last_access_time
last_write_time
path_locator
stream_id
システム定義の既定の制約によって、指定した列に既定値が適用されます。
CHECK 制約 システム定義の CHECK 制約によって、次の要件が適用されます。

有効なファイル名。
有効なファイル属性。
親オブジェクトをディレクトリにする。
名前空間の階層は、ファイル操作中にロックされる。

システム定義制約の名前付け規則

前に説明したシステム定義制約には、次のような形式 <constraintType>_<tablename>[_<columnname>]_<uniquifier> 名前が付けられています。

  • '<constraint_type> は CK (check 制約)、DF (既定の制約)、FK (外部キー)、PK (主キー)、または UQ (一意制約) です。

  • <uniquifier> は、名前を一意にするためのシステム生成文字列です。 この文字列には、FileTable 名と一意の識別子が含まれている場合があります。