创建、更改或删除 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

要创建 FileTable,可以使用带有 AS FILETABLE 选项的 CREATE TABLE 语句。 由于 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

在对象资源管理器中,展开所选数据库下的对象,然后右键单击“Tables”文件夹,选择“新建 FileTable”

此选项将打开一个新的脚本窗口,其中包含一个 Transact-SQL 脚本模板,你可以对其进行自定义和运行以创建 FileTable。 使用 “查询” 菜单上的 “指定模板参数的值” 选择可轻松指定脚本。

创建 FileTable 的要求和限制

  • 不能更改现有表以将其转换为 FileTable。

  • 先前在数据库级别指定的父目录还必须具有非 Null 值。 有关指定数据库级目录的信息,请参阅 “启用 FileTable 的先决条件”。

  • 由于一个 FileTable 包含一个 FILESTREAM 列,因此,FileTable 需要有效的 FILESTREAM 文件组。 可以选择将有效的 FILESTREAM 文件组指定为用于创建 FileTable 的命令的一部分 CREATE TABLE 。 如果未指定文件组,则 FileTable 将使用数据库的默认 FILESTREAM 文件组。 如果数据库没有 FILESTREAM 文件组,则会引发错误。

  • 不能在CREATE TABLE...AS FILETABLE语句中创建表约束。 但是,以后可以使用语句添加约束 ALTER TABLE

  • 不能在 tempdb 数据库中或任何其他系统数据库中创建 FileTable。

  • 不能将 FileTable 创建为临时表。

更改 FileTable

由于 FileTable 具有预定义的固定架构,因此无法添加或更改其列。 但是,可以将自定义索引、触发器、约束和其他选项添加到 FileTable。

有关使用ALTER TABLE语句启用或禁用 FileTable 命名空间(包括系统定义的约束)的信息,请参阅“管理 FileTable”。

使用 Transact-SQL 更改 FileTable 的目录

执行ALTER TABLE语句,并为FILETABLE_DIRECTORYSET选项提供有效的新值。

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
系统定义的默认约束强制采用指定列的默认值。
检查约束 系统定义的检查约束强制执行下列要求:

有效的文件名。
有效的文件属性。
父对象必须是目录。
命名空间层次结构在文件操作过程中锁定。

系统定义约束的命名约定

前面所述的系统定义约束以以下格式 <constraintType>_<tablename>[_<columnname>]_<uniquifier> 命名:

  • “<constraint_type> 是 CK(检查约束)、DF(默认约束)、FK(外键)、PK(主键)或 UQ(唯一约束)。

  • <uniquifier> 是一个系统生成的字符串,使名称唯一。 此字符串可能包含 FileTable 名称和唯一标识符。