介绍如何创建新的 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 指定以下设置:
FILETABLE_DIRECTORY。 指定用作 FileTable 中存储的所有文件和目录的根目录。 此名称应在数据库的所有 FileTable 目录名称中唯一。 比较唯一性时不区分大小写,无论当前的字符排序设定。
此值的数据类型为 nvarchar(255), 并使用固定排序规则 Latin1_General_CI_AS_KS_WS。
提供的目录名称必须符合文件系统对有效目录名称的要求。
此名称应在数据库的所有 FileTable 目录名称中唯一。 唯一性比较不区分大小写,忽略当前的排序规则设置。
如果在创建 FileTable 时未提供目录名称,则 FileTable 本身的名称将用作目录名称。
FILETABLE_COLLATE_FILENAME。 指定要应用于 FileTable 中 “名称 ”列的排序规则的名称。
指定的排序规则必须 不区分大小写 才能符合 Windows 文件命名语义。
如果未为 FILETABLE_COLLATE_FILENAME提供值,或者指定 database_default,则列将继承当前数据库的排序规则。 如果当前数据库排序规则区分大小写,则会引发错误,并且 CREATE TABLE 操作失败。
还可以指定用于自动创建的 3 个主键和唯一约束的名称。 如果未提供名称,系统将根据本主题后面所述的方法生成名称。
FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME
FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME
FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME
示例
以下示例创建一个新的 FileTable,并为 FILETABLE_DIRECTORY 和 FILETABLE_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 名称和唯一标识符。