描述文件系统 I/O 在 FileTable 上的工作原理。
开始将文件 I/O API 与 FileTable 配合使用
FileTable 的主要使用方式应通过 Windows 文件系统和文件输入输出 API。 FileTable 通过丰富的可用文件 I/O API 集支持非事务性访问。
文件 I/O API 访问通常首先获取文件或目录的逻辑 UNC 路径。 应用程序可以使用具有 GetFileNamespacePath (Transact-SQL) 函数的 Transact-SQL 语句来获取文件或目录的逻辑路径。 有关详细信息,请参阅 使用 FileTable 中的目录和路径。
然后,应用程序使用此逻辑路径获得文件或目录的句柄,并对该对象执行某些操作。 该路径可以传递给任何受支持的文件系统 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、函数、存储过程和视图