FILESTREAM 与其他 SQL Server 功能的兼容性

由于 FILESTREAM 数据在文件系统中,因此本主题提供了一些注意事项、准则和限制,用于在 SQL Server 中使用 FILESTREAM 和以下功能:

SQL Server Integration Services (SSIS)

SQL Server Integration Services (SSIS) 使用 DT_IMAGE SSIS 数据类型处理数据流中的 FILESTREAM 数据,就像处理任何其他 BLOB 数据一样。

可以使用导入列转换将文件系统中的文件加载到 FILESTREAM 列中。 还可以使用导出列转换将文件从 FILESTREAM 列提取到文件系统中的另一个位置。

分布式查询和链接服务器

可以通过分布式查询和链接服务器处理 FILESTREAM 数据,方法是将其视为 varbinary(max) 数据。 即使名称引用本地服务器,也不能在分布式查询中使用 FILESTREAM PathName() 函数,这些函数使用由四部分构成的名称。 但是,可以在使用 OPENQUERY()的传递查询的内部查询中使用 PathName()。

加密

即使启用了透明数据加密,FILESTREAM 数据也不会加密。

数据库快照

SQL Server 不支持 FILESTREAM 文件组 的数据库快照 。 如果 CREATE DATABASE ON 子句中包含 FILESTREAM 文件组,该语句将失败,并引发错误。

使用 FILESTREAM 时,可以创建标准(非 FILESTREAM)文件组的数据库快照。 对于这些数据库快照,FILESTREAM 文件组标记为脱机。

在数据库快照中的 FILESTREAM 表上执行的 SELECT 语句不得包含 FILESTREAM 列;否则,将返回以下错误消息:

Could not continue scan with NOLOCK due to data movement.

重复

启用了 FILESTREAM 属性的varbinary(max)列可以在发布服务器上复制到订阅服务器,无论其是否使用 FILESTREAM 属性。 若要指定列的复制方式,请使用“项目属性 - <项目>”对话框或@schema_optionsp_addarticlesp_addmergearticle的参数。 复制到 varbinary(max) 没有 FILESTREAM 属性的列的数据不能超过该数据类型的 2 GB 限制;否则,将生成运行时错误。 建议复制 FILESTREAM 属性,除非你要将数据复制到 SQL Server 2000 订阅服务器。这种情况下,无论指定何种架构选项,都不支持复制。

注释

将大型数据值从 SQL Server 2014 复制到 SQL Server 2005 (9.x) 订阅服务器限制为最多 256 MB 的数据值。 有关详细信息,请参阅 最大容量规范

事务复制的注意事项

如果在为事务复制发布的表中使用 FILESTREAM 列,请注意以下注意事项:

  • 如果任何表包含具有 FILESTREAM 属性的列,则不能对@sync_methodsp_addpublication的属性使用数据库快照数据库快照字符的值。

  • max text repl size 选项指定可以插入到用于发布复制的列中的最大数据量。 此选项可用于控制复制的 FILESTREAM 数据的大小。

  • 如果指定用于复制 FILESTREAM 属性的架构选项,但筛选掉 uniqueidentifier FILESTREAM 所需的列,或者指定不复制列的 UNIQUE 约束,则复制不会复制 FILESTREAM 属性。 该列仅作为 varbinary(max) 列进行复制。

合并复制的注意事项

如果在为合并复制发布的表中使用 FILESTREAM 列,请注意以下几点:

  • 合并复制和 FILESTREAM 都需要一列数据类型 uniqueidentifier 来标识表中的每一行。 如果表没有列,合并复制会自动添加列。 合并复制要求列具有 ROWGUIDCOL 属性,并且默认值需要为 NEWID() 或 NEWSEQUENTIALID()。 除了这些要求,FILESTREAM 还要求为列定义 UNIQUE 约束。 这些要求具有以下后果:

    • 如果将 FILESTREAM 列添加到已发布用于合并复制的表中,请确保 uniqueidentifier 列具有 UNIQUE 约束。 如果它没有 UNIQUE 约束,请将命名约束添加到发布数据库中的表。 默认情况下,合并复制将发布此架构更改,并将应用于每个订阅数据库。

      如果您按照所述手动添加了 UNIQUE 约束,并希望删除合并复制,则必须先删除该 UNIQUE 约束,否则删除复制将会失败。

    • 默认情况下,合并复制使用 NEWSEQUENTIALID(),因为它可以提供比 NEWID 更好的性能。 如果向要发布用于合并复制的表添加 uniqueidentifier 列,请将 NEWSEQUENTIALID() 设置为默认值。

  • 合并复制包括用于复制大型对象类型的优化。 此优化由@stream_blob_columnssp_addmergearticle的参数控制。 如果将架构选项设置为复制 FILESTREAM 属性,则 @stream_blob_columns 参数值设置为 true。 可以使用 sp_changemergearticle覆盖此优化。 此存储过程使你能够将@stream_blob_columns设置为false。 如果将 FILESTREAM 列添加到已用于合并复制的发表表中,我们建议使用 sp_changemergearticle 将选项设置为 true

  • 创建项目后为 FILESTREAM 启用架构选项可能会导致复制失败,如果 FILESTREAM 列中的数据超过 2 GB,并且复制期间存在冲突。 如果预期会出现这种情况,建议在创建时删除并重新创建具有相应 FILESTREAM 架构选项的表项目。

  • 合并复制可以通过 HTTPS 连接使用 Web 同步同步 FILESTREAM 数据。 此数据不能超过 Web 同步的 50 MB 限制;否则,将生成运行时错误。

日志传送

日志传送 支持 FILESTREAM。 主服务器和辅助服务器都必须运行 SQL Server 2008 或更高版本,并且已启用 FILESTREAM。

数据库镜像

数据库镜像不支持 FILESTREAM。 无法在主体服务器上创建 FILESTREAM 文件组。 不能为包含 FILESTREAM 文件组的数据库配置数据库镜像。

Full-Text 索引

全文索引 在 FILESTREAM 列中与在 varbinary(max) 列中工作的方式相同。 FILESTREAM 表必须具有一个列,其中包含每个 FILESTREAM BLOB 的文件扩展名。 有关详细信息,请参阅 使用 Full-Text 搜索配置和管理搜索筛选器的查询,以及 sys.fulltext_document_types(Transact-SQL)

全文引擎为 FILESTREAM BLOB 的内容编制索引。 索引文件(如图像)可能没有用处。 更新 FILESTREAM BLOB 时,会重新编制索引。

故障转移群集

对于故障转移群集,必须将 FILESTREAM 文件组放在共享磁盘上。 必须在将承载 FILESTREAM 实例的群集中的每个节点上启用 FILESTREAM。 如需更多信息,请参阅 在故障转移群集上设置 FILESTREAM

SQL Server Express

SQL Server Express 支持 FILESTREAM。 10 GB 数据库大小限制不包括 FILESTREAM 数据容器。

包含的数据库

FILESTREAM 功能需要数据库外部的某些配置。 因此,使用 FILESTREAM 或 FileTable 的数据库不是完全独立的。

如果要使用包含的数据库的某些功能(如包含的用户),可以将数据库包含设置为 PARTIAL。 但是,在这种情况下,必须注意,某些数据库设置不包含在数据库中,并且不会在数据库移动时自动移动。

另请参阅

二进制大型对象 (Blob) 数据 (SQL Server)