管理 FileTables

介绍用于管理 FileTable 的常见管理任务。

如何:获取 FileTable 和相关对象的列表

若要获取 FileTable 列表,请查询以下目录视图之一:

SELECT * FROM sys.filetables;  
GO  
  
SELECT * FROM sys.tables WHERE is_filetable = 1;  
GO  

若要获取在创建关联的 FileTable 时创建的系统定义对象的列表,请查询目录视图 sys.filetable_system_defined_objects(Transact-SQL)

SELECT object_id, OBJECT_NAME(object_id) AS 'Object Name'  
    FROM sys.filetable_system_defined_objects  
    WHERE object_id = filetable_object_id;  
GO  

在数据库级别禁用和重新启用非事务访问

若要获取某些管理任务所需的独占访问权限,可能需要暂时禁用非事务性访问。

更改非事务性访问级别时 ALTER DATABASE 语句的行为

  • 将非事务性访问设置为 READ_ONLY 或 OFF 时,只要存在与请求操作冲突的打开文件句柄,ALTER DATABASE 命令就不会将控制权返回给用户。 与此操作冲突的文件包括:

    • 当您将访问权限设置为NONE时,所有打开的文件句柄将会受到影响。

    • 设置对 READ_ONLY的访问权限时,将打开所有文件句柄进行写入访问。

    有关删除打开的文件句柄的信息,请参阅本主题中的 删除与 FileTable 关联的打开文件句柄

    如果 ALTER DATABASE 命令已取消或以超时结束,则事务访问级别不会更改。

  • 如果使用带有 <终止> 子句(ROLLBACK AFTER 整数 [ SECONDS ] | 立即回滚 | 不等待) 调用 ALTER DATABASE 语句,那么所有打开的非事务性文件句柄都会被终止。

警告

关闭打开的文件句柄可能会导致用户丢失未保存的数据。 此行为与文件系统本身的行为一致。

禁用非事务性访问的影响

在数据库级别更改非事务性访问级别会对数据库级目录下的 FileTable 目录产生以下影响:

  • 设置对 NONE 的访问权限时,所有 FileTable 目录及其内容都不再可访问或可见。

  • 设置 对READ_ONLY的访问权限时,所有 FileTable 目录及其内容也是只读的。

在实例级别禁用 FILESTREAM 会对该实例上的数据库级目录以及其下的 FileTable 目录产生以下影响:

  • 如果在实例级别禁用 FILESTREAM,则实例上的数据库级目录均不可见。

如何:在数据库级别禁用和重新启用非事务访问

有关详细信息,请参阅 ALTER DATABASE SET 选项 (Transact-SQL)

禁用完全非事务性访问
调用 ALTER DATABASE 语句并设置NON_TRANSACTED_ACCESS的值以READ_ONLYOFF

-- Disable write access.  
ALTER DATABASE database_name  
    SET FILESTREAM ( NON_TRANSACTED_ACCESS = READ_ONLY );  
GO  
  
-- Disable non-transactional access.  
ALTER DATABASE database_name  
    SET FILESTREAM ( NON_TRANSACTED_ACCESS = OFF );  
GO  

重新启用完全非事务访问
调用 ALTER DATABASE 语句并将 NON_TRANSACTED_ACCESS 的值设置为 FULL

ALTER DATABASE database_name  
    SET FILESTREAM ( NON_TRANSACTED_ACCESS = FULL );  
GO  

如何:确保数据库中 FileTable 的可见性

当所有这些条件都为 true 时,数据库级目录及其下的 FileTable 目录可见:

  1. FILESTREAM 在实例级别启用。

  2. 非事务性访问在数据库级别启用。

  3. 已在数据库级别指定有效的目录。

在表级别禁用并重新启用 FileTable 命名空间

禁用 FileTable 命名空间会禁用使用 FileTable 创建的所有系统定义约束和触发器。 在必须使用 Transact-SQL 操作对 FileTable 进行大规模重组的情况下,而无需承担强制实施 FileTable 语义的费用时,这非常有用。 但是,这些作可能会使 FileTable 处于不一致状态,并可能阻止重新启用 FileTable 命名空间。

禁用 FileTable 命名空间具有以下结果:

  • FileTable 列和数据不会从表中物理删除。

  • FileTable 目录及其包含的文件和目录从文件系统中消失,不适用于文件 i/o 访问。

  • 无法删除和重新创建系统定义的 FileTable 列,但在 DML 操作中,它们的行为类似于普通列。

  • 打开文件句柄可防止禁用 FileTable 约束,因为此作需要表上的架构锁。

  • 禁用 FileTable 命名空间后,所有 FileTable 语义(包括系统定义的约束和触发器)的实施将停止。

重新启用 FileTable 命名空间具有以下结果:

  • 检查 FileTable 的一致性。 如果发现不一致,则会引发错误,FileTable 将保持禁用状态;否则,将重新启用 FileTable。

  • FileTable 语义的强制执行,包括系统定义的约束和触发器,已被恢复。

  • FileTable 目录及其包含的文件和目录在文件系统中可见,并可用于文件 i/o 访问。

如何在表级别禁用和重新启用 FileTable 命名空间功能

使用 ALTER TABLE 语句时,调用 { ENABLE | DISABLE } FILETABLE_NAMESPACE 选项。

禁用 FileTable 命名空间

ALTER TABLE filetable_name  
   DISABLE FILETABLE_NAMESPACE;  
GO  

重新启用 FileTable 命名空间

ALTER TABLE filetable_name  
   ENABLE FILETABLE_NAMESPACE;  
GO  

关闭与 FileTable 关联的打开文件句柄

打开存储在 FileTable 中的文件的句柄可能会阻止某些管理任务所需的独占访问。 若要启用紧急任务,可能需要终止与一个或多个 FileTables 关联的打开的文件句柄。

警告

终止打开的文件句柄可能会导致用户丢失未保存的数据。 此行为与文件系统本身的行为一致。

如何:获取与 FileTable 关联的打开文件句柄列表

查询目录视图 sys.dm_filestream_non_transacted_handles(Transact-SQL)

SELECT * FROM sys.dm_filestream_non_transacted_handles;  
GO  

如何关闭与 FileTable 关联的打开文件句柄

使用适当的参数调用存储过程 sp_kill_filestream_non_transacted_handles(Transact-SQL), 以终止数据库中或 FileTable 中的所有打开的文件句柄,或终止特定句柄。

USE database_name;  
  
-- Kill all open handles in all the filetables in the database.  
EXEC sp_kill_filestream_non_transacted_handles;  
GO  
  
-- Kill all open handles in a single filetable.  
EXEC sp_kill_filestream_non_transacted_handles @table_name = 'filetable_name';  
GO  
  
-- Kill a single handle.  
EXEC sp_kill_filestream_non_transacted_handles @handle_id = integer_handle_id;  
GO  

如何识别 FileTable 所持有的锁

FileTable 占用的大多数锁对应于应用程序打开的文件。

标识打开的文件和关联的锁
在动态管理视图sys.dm_tran_locks(Transact-SQL)中将request_owner_id字段与sys.dm_filestream_non_transacted_handles(Transact-SQL)中的fcb_id字段联接。 在某些情况下,锁与单个打开的文件句柄不对应。

SELECT opened_file_name  
    FROM sys.dm_filestream_non_transacted_handles  
    WHERE fcb_id IN  
        ( SELECT request_owner_id FROM sys.dm_tran_locks );  
GO  

FileTable 安全性

存储在 FileTable 中的文件和目录仅受 SQL Server 安全性保护。 对文件系统访问和 Transact-SQL 访问强制执行基于表和列的安全性。 不支持 Windows 文件系统安全 API 和 ACL 设置。

适用于 FILESTREAM 文件组和容器的安全性和访问权限也适用于 FileTable,因为文件数据存储为 FileTable 中的 FILESTREAM 列。

FileTable 安全性和 Transact-SQL 访问权限
Transact-SQL 对 FileTable 中的数据的访问与任何其他表一样受到保护。 对每个访问或更改数据的操作进行适当的表和列级安全检查。

FileTable 安全性和文件系统访问
文件系统 API 要求对 FileTable(即表级权限)中整个行具有适当的 SQL Server 权限,才能打开 FileTable 中存储的文件或目录的句柄。 如果用户对 FileTable 中的任何列没有适当的 SQL Server 权限,则会拒绝文件系统访问。

备份和文件表

使用 SQL Server 备份 FileTable 时,FILESTREAM 数据将使用数据库中的结构化数据进行备份。 如果不想使用关系数据备份 FILESTREAM 数据,可以使用部分备份来排除 FILESTREAM 文件组。

FileTable 备份的事务一致性

许多管理工具和操作(如包括备份、日志备份和事务复制)通过读取事务日志来读取事务性一致的数据。 此时,他们将读取作为事务的一部分更新的任何 FILESTREAM 数据。 如果未在数据库级别启用非事务性访问,这些工具和操作将以完整的事务一致性进行工作。

但是,启用完全非事务访问时,FileTable 可能包含最近更新的数据(通过非事务更新),而不是工具或进程从事务日志中读取的事务。 这意味着,对特定事务的“时间点”还原作业可能包含比该事务更新的 FILESTREAM 数据。 这是 FileTable 上允许非事务性更新时的预期行为。

SQL Server Profiler 和 FileTable

SQL Server Profiler 可以捕获存储在 FileTable 中的文件的 Windows 文件打开和关闭操作,并将其记录在跟踪输出中。

审计和 FileTables

FileTable 可以像任何其他表一样进行审核。 然而,Win32 访问模式不是基于集合操作。 文件系统中的单个操作转化为多个 Transact-SQL DML 操作。 例如,在 Microsoft Word 中打开文件将转换为多个打开/关闭/创建/重命名/删除操作以及相应的 Transact-SQL DML 活动。 这会导致产生详尽的审核记录,使得很难将文件系统操作与相应的 Transact-SQL DML 审核记录关联起来。

DBCC 和 FileTable

可以使用 DBCC CHECKCONSTRAINTS 来验证 FileTable 上的约束,包括系统定义的约束。

另请参阅

FileTable 与其他 SQL Server 功能的兼容性
FileTable DDL、函数、存储过程和视图