创建、更改和删除 FileTable

介绍如何创建新的 FileTable,或更改或删除现有 FileTable。

创建文件表

FileTable 是具有预定义和固定架构的专用用户表。 此架构存储 FILESTREAM 数据、文件和目录信息以及文件属性。 有关 FileTable 架构的信息,请参阅 FileTable 架构

可以使用 Transact-SQL 或 SQL Server Management Studio 创建新的 FileTable。 由于 FileTable 具有固定架构,无需指定列列表。 用于创建 FileTable 的简单语法使你可以指定:

  • 目录名称。 在 FileTable 文件夹层次结构中,此表级目录将成为数据库级别指定的数据库目录的子目录,以及存储在表中的文件或目录的父级。

  • 用于 FileTable 的名称列中文件名排序的规则名称。

  • 要用于自动创建的 3 个主要键和唯一约束的名称。

如何创建FileTable

使用 Transact-SQL 创建 FileTable
使用 AS FileTable 选项调用 CREATE TABLE (Transact-SQL) 语句来创建 FileTable。 由于 FileTable 具有固定架构,无需指定列列表。 可以为新的 FileTable 指定以下设置:

  1. FILETABLE_DIRECTORY。 指定用作 FileTable 中存储的所有文件和目录的根目录。 此名称应在数据库的所有 FileTable 目录名称中唯一。 比较唯一性时不区分大小写,无论当前的字符排序设定。

    • 此值的数据类型为 nvarchar(255), 并使用固定排序规则 Latin1_General_CI_AS_KS_WS

    • 提供的目录名称必须符合文件系统对有效目录名称的要求。

    • 此名称应在数据库的所有 FileTable 目录名称中唯一。 唯一性比较不区分大小写,忽略当前的排序规则设置。

    • 如果在创建 FileTable 时未提供目录名称,则 FileTable 本身的名称将用作目录名称。

  2. FILETABLE_COLLATE_FILENAME。 指定要应用于 FileTable 中 “名称 ”列的排序规则的名称。

    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”。

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

创建 FileTable 的要求和限制

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

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

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

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

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

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

更改文件表

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

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

如何:更改 FileTable 的目录

使用 Transact-SQL 更改 FileTable 的目录
调用 ALTER TABLE 语句并为 FILETABLE_DIRECTORY SET 选项提供有效的新值。

示例

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 (Transact-SQL) 语句的普通语法删除 FileTable。

删除 FileTable 时,也会删除以下对象:

  • FileTable 的所有列以及与表关联的所有对象(如索引、约束和触发器)也会被删除。

  • FileTable 目录及其包含的子目录从数据库的 FILESTREAM 文件和目录层次结构中消失。

如果 FileTable 的文件命名空间中有打开的文件句柄,DROP TABLE 命令将失败。 有关关闭打开句柄的信息,请参阅“管理 FileTable”。

创建 FileTable 时会创建其他数据库对象

创建新的 FileTable 时,还会创建一些系统定义的索引和约束。 不能更改或删除这些对象;仅当 FileTable 本身被删除时,它们才会消失。 若要查看这些对象的列表,请查询目录视图sys.filetable_system_defined_objects(Transact-SQL)。

--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 时,还会创建以下系统定义的索引:

索引类型
[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_write_time
path_locator
stream_id
系统定义的默认约束强制执行指定列的默认值。
CHECK 约束 系统定义的检查约束强制实施以下要求:

有效文件名。

有效的文件属性。

父对象必须是目录。

命名空间层次结构在文件操作过程中被锁定。

系统定义约束的命名约定
上述系统定义的约束以格式 <constraintType>_<tablename>[_<columnname>]_<uniquifier> 命名,其中:

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

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

另请参阅

管理 FileTable