使用 File Input-Output APIs 访问 FileTable

描述文件系统 I/O 在 FileTable 上的工作原理。

开始将文件 I/O API 与 FileTable 配合使用

FileTable 的主要使用方式应通过 Windows 文件系统和文件输入输出 API。 FileTable 通过丰富的可用文件 I/O API 集支持非事务性访问。

  1. 文件 I/O API 访问通常首先获取文件或目录的逻辑 UNC 路径。 应用程序可以使用具有 GetFileNamespacePath (Transact-SQL) 函数的 Transact-SQL 语句来获取文件或目录的逻辑路径。 有关详细信息,请参阅 使用 FileTable 中的目录和路径

  2. 然后,应用程序使用此逻辑路径获得文件或目录的句柄,并对该对象执行某些操作。 该路径可以传递给任何受支持的文件系统 API 函数,例如 CreateFile() 或 CreateDirectory(),以创建或打开文件并获取句柄。 然后,句柄可用于流式传输数据、枚举或组织目录、获取或设置文件属性、删除文件或目录等。

在 FileTable 中创建文件和目录

可以通过调用文件 I/O API(如 CreateFile 或 CreateDirectory)在 FileTable 中创建文件或目录。

  • 支持所有创建配置标志、共享模式和访问模式。 这包括文件创建、删除和就地修改。 还支持文件命名空间更新,即目录创建/删除、重命名和移动作。

  • 创建新文件或目录对应于基础 FileTable 中新行的创建。

  • 对于文件,流数据存储在 file_stream 列中;对于目录,此列为 null。

  • 对于文件, is_directory 列包含 false。 对于目录,此列包含 true

  • 当多个并发的文件 I/O 操作或 Transact-SQL 操作影响层次结构中的相同文件或目录时,将强制实施共享和访问的并发性。

读取 FileTable 中的文件和目录

对于流数据和属性数据的所有文件 I/O 访问操作,SQL Server 中强制实行已提交读隔离语义。

在 FileTable 中写入和更新文件和目录

  • FileTable 上的所有文件 I/O 写入或更新操作都是非事务性的。 也就是说,没有 SQL Server 事务绑定到这些操作,并且没有提供 ACID 保证。

  • FileTable 支持所有文件 I/O 流式处理/就地更新。

  • 通过文件 I/O API 更新 FILESTREAM 数据或属性会导致更新 FileTable 中相应的 file_stream 和文件属性列。

删除 FileTable 中的文件和目录

删除文件或目录时,将强制实施所有 Windows 文件 I/O API 语义。

  • 如果目录包含任何文件子目录,则删除目录将失败。

  • 删除文件或目录会从 FileTable 中删除相应的行。 这相当于通过 Transact-SQL 操作删除该行。

支持的文件系统操作

FileTable 支持与以下文件系统操作有关的文件系统 API:

  • 目录管理

  • 文件管理

FileTable 不支持以下操作:

  • 磁盘管理

  • 卷管理

  • 事务性 NTFS

对 FileTable 的文件 I/O 访问的其他注意事项

将虚拟网络名称(VNN)与 AlwaysOn 可用性组配合使用

如果包含 FILESTREAM 或 FileTable 数据的数据库属于 AlwaysOn 可用性组,则通过文件系统 API 访问 FILESTREAM 或 FileTable 数据的所有访问都应使用 VNN 而不是计算机名称。 有关详细信息,请参阅具有 AlwaysOn 可用性组的 FILESTREAM 和 FileTable(SQL Server)。

部分更新

使用 GetFileNamespacePath(Transact-SQL) 函数为 FileTable 中的 FILESTREAM 数据获得的可写句柄可用于对 FILESTREAM 内容进行部分就地更新。 此行为与通过调用 OpenSQLFILESTREAM() 并传递显式事务上下文来获取句柄,从而进行事务化 FILESTREAM 访问的方式不同。

事务语义

使用文件 I/O API 访问 FileTable 中的文件时,这些作不会与任何用户事务相关联,并且具有以下附加特征:

  • 由于对 FileTable 中 FILESTREAM 数据的非事务处理访问未与任何事务相关联,因此它没有任何特定的隔离语义。 但是,SQL Server 可以使用内部事务对 FileTable 数据强制实施锁定或并发语义。 此类型的任何内部事务都是通过读取提交的隔离完成的。

  • 这些非事务性操作对 FILESTREAM 数据没有 ACID 保证。 一致性保证类似于文件系统中应用程序进行的文件更新的保证。

  • 无法回滚这些更改。

但是,可以通过调用OpenSqlFileStream()以事务访问方式访问 FileTable 中的 FILESTREAM 列。 此类访问可以完全支持事务操作,并且将一致遵循当前支持的所有事务级别。

并发控制

SQL Server 对文件系统应用程序之间的 FileTable 访问以及文件系统应用程序和 Transact-SQL 应用程序之间强制实施并发控制。 通过对 FileTable 行采取适当的锁来实现此并发控制。

触发器

通过文件系统创建、修改或删除文件或目录或其属性会导致 FileTable 中的相应插入、更新或删除作。 任何关联的 Transact-SQL DML 触发器作为这些作业的一部分被触发。

FileTable 中支持的文件系统功能

能力 已支持 注释
Oplocks 是的 支持级别 2、级别 1、批处理机会锁和筛选机会锁。
扩展属性
重新分析点
持久访问控制列表
命名流
稀疏文件 是的 稀疏性只能在文件上设置,并影响数据流的存储。 由于 FILESTREAM 数据存储在 NTFS 卷上,因此 FileTable 功能通过将请求转发到 NTFS 文件系统支持稀疏文件。
压缩 是的
Encryptiion 是的
TxF
文件 ID
对象 ID
符号链接
硬链接
短名称
目录更改通知
字节范围锁定 是的 字节范围锁定的请求将传递到 NTFS 文件系统。
内存映射文件
取消 I/O 是的
安全性 强制实施 Windows 共享级别安全性以及 SQL Server 表和列级安全性。
USN 日记 对 FileTable 中的文件和目录的元数据更改是在 SQL Server 数据库上的 DML 操作。 因此,它们将记录在相应的数据库日志文件中。 但是,它们不会记录在 NTFS USN 日记中(大小更改除外)。

SQL Server 更改跟踪功能可用于捕获类似信息。

另请参阅

将文件加载到 FileTable 中
在 FileTables 中使用目录和路径
使用 Transact-SQL 访问 FileTable
FileTable DDL、函数、存储过程和视图