FILESTREAM 与其他 SQL Server 功能的兼容性
由于 FILESTREAM 数据存在于文件系统中,因此本主题提供了将 FILESTREAM 与 SQL Server中的以下功能一起使用时的一些注意事项、指南和限制:
SQL Server Integration Services (SSIS)
SQL Server Integration Services (SSIS) 使用 DT_IMAGE SSIS 数据类型像处理任何其他 BLOB 数据一样处理数据流中的 FILESTREAM 数据。
您可以使用“导入列”转换将文件从文件系统加载到 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_addarticle或sp_addmergearticle的参数。 复制到不具有 FILESTREAM 属性的 varbinary(max)
列的数据不能超过该数据类型的 2 GB 大小限制;否则,将产生运行时错误。 建议复制 FILESTREAM 属性,除非不支持将数据复制到 SQL Server 2000 订阅服务器,而不考虑指定的架构选项。
注意
将大型数据值从 SQL Server 2014 复制到 2005 SQL Server (9.x) 订阅服务器限制为最多 256 MB 数据值。 有关详细信息,请参阅 最大容量规范。
事务复制的注意事项
如果您使用为事务复制发布的表中的 FILESTREAM 列,请注意以下事项:
如果表中的列具有 FILESTREAM 属性,则不能将 database snapshot 或 database snapshot character 的值用于 sp_addpublication 的 @sync_method 属性。
max text repl size 选项用于指定可以插入到为复制发布的列中的最大数据量。 此选项可用来控制复制的 FILESTREAM 数据的大小。
如果您指定了用于复制 FILESTREAM 属性的架构选项,但您筛选出了 FILESTREAM 所需的
uniqueidentifier
列或指定不复制对该列的 UNIQUE 约束,则复制操作不复制 FILESTREAM 属性。 该列将只作为varbinary(max)
列复制。
合并复制的注意事项
如果您使用为合并复制发布的表中的 FILESTREAM 列,请注意以下事项:
合并复制和 FILESTREAM 都需要一个数据类型为
uniqueidentifier
的列来标识表中的每一行。 如果相应的表中没有这样的列,合并复制会自动添加一列。 合并复制要求该列具有 ROWGUIDCOL 属性集和默认值 NEWID() 或 NEWSEQUENTIALID()。 除这些要求外,FILESTREAM 还要求为该列定义一个 UNIQUE 约束。 这些要求将产生以下结果:如果您向已经为合并复制发布的表添加 FILESTREAM 列,请确保
uniqueidentifier
列具有 UNIQUE 约束。 如果该列不具有 UNIQUE 约束,请向发布数据库中的该表添加一个命名约束。 默认情况下,合并复制将发布此项架构更改,此更改将应用于每个订阅数据库。如果您已按照说明手动添加了 UNIQUE 约束,并且要删除合并复制,则您必须先删除 UNIQUE 约束;否则,复制删除操作将失败。
默认情况下,合并复制使用 NEWSEQUENTIALID(),因为与 NEWID() 相比,它可以提供更高的性能。 如果您要向将为合并复制发布的表添加
uniqueidentifier
列,请指定 NEWSEQUENTIALID() 作为默认值。
合并复制包括为复制大型对象类型而进行的优化。 这种优化由 sp_addmergearticle 的 @stream_blob_columns 参数控制。 如果您设置了用于复制 FILESTREAM 属性的架构选项,则 @stream_blob_columns 参数值将设置为
true
。 通过使用 sp_changemergearticle,可以替代这种优化。 此存储过程支持您将 @stream_blob_columns 设置为false
。 如果您要将 FILESTREAM 列添加到已经为合并复制发布的表中,建议您使用 sp_changemergearticle 将该选项设置为true
。如果 FILESTREAM 列中的数据大小超过 2 GB,则在创建项目后为 FILESTREAM 启用架构选项会导致复制失败,且复制过程中会发生冲突。 如果您预计这种情况会发生,建议您删除表项目,然后重新创建它,并在创建时间启用相应的 FILESTREAM 架构选项。
合并复制可以使用 Web 同步通过 HTTPS 连接同步 FILESTREAM 数据。 此数据不能超过针对 Web 同步的 50 MB 大小限制;否则,将产生运行时错误。
日志传送
日志传送 支持 FILESTREAM。 主服务器和辅助服务器运行的都必须是 SQL Server 2008或更高版本,并且必须启用 FILESTREAM。
数据库镜像
数据库镜像不支持 FILESTREAM。 不能在主体服务器上创建 FILESTREAM 文件组。 不能为包含 FILESTREAM 文件组的数据库配置数据库镜像。
全文索引
全文索引 处理 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。 但在此情况下,您必须知道某些数据库设置未包含在数据库中,并且在数据库移动时不自动移动。