将 FILESTREAM 与其他 SQL Server 功能配合使用

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

  • SQL Server Integration Services (SSIS)

  • 分布式查询和链接服务器

  • 数据库快照

  • Replication

  • 日志传送

  • 数据库镜像

  • 全文

  • 故障转移群集

  • SQL Server Express

SQL Server Integration Services (SSIS)

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

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

分布式查询和链接服务器

您可以通过将其作为 varbinary(max) 数据处理,通过分布式查询和链接服务器使用 FILESTREAM 数据。不能在使用四个部分组成的名称的分布式查询中使用 FILESTREAM PathName() 函数,即使在该名称引用本地服务器时也是如此。但是,您可以在使用 OPENQUERY() 的传递查询的内部查询中使用 PathName()

数据库快照

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 属性,也可以不带。若要指定复制列的方式,可以使用**“项目属性 - <项目>”**对话框,也可以使用 sp_addarticlesp_addmergearticle@schema_option 参数。有关如何设置架构选项的详细信息,请参阅如何指定架构选项 (SQL Server Management Studio)如何指定架构选项(复制 Transact-SQL 编程)。复制到不具有 FILESTREAM 属性的 varbinary(max) 列的数据不能超过该数据类型的 2 GB 大小限制;否则,将产生运行时错误。我们建议,如果您不是将数据复制到 SQL Server 2005,请复制 FILESTREAM 属性。不论指定的架构选项是什么,均不支持将包含 FILESTREAM 列的表复制到 SQL Server 2000 订阅服务器。有关如何将数据复制到 SQL Server 早期版本的详细信息,请参阅在复制拓扑中使用 SQL Server 的多个版本

注意注意

从 SQL Server 2008 复制到 SQL Server 2005 订阅服务器的大数据值最多不得超过 256 MB。有关详细信息,请参阅最大容量规范

事务复制的注意事项

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

  • 只要表中的列具有 FILESTREAM 属性,就不能将 database snapshot 或 database snapshot character 的值用于 sp_addpublication@sync_method 属性。

  • max text repl size 选项用于指定可以插入到为复制发布的列中的最大数据量。此选项可用来控制复制的 FILESTREAM 数据的大小。有关详细信息,请参阅 max text repl size 选项

  • 如果您指定了用于复制 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 的文件扩展名。有关详细信息,请参阅查询 varbinary(max) 和 xml 列(全文搜索)全文搜索筛选器全文索引和查询过程sys.fulltext_document_types (Transact-SQL)

全文引擎会对 FILESTREAM BLOB 的内容进行索引。对诸如图像之类的文件进行索引可能没有用。更新 FILESTREAM BLOB 时,会重新对其进行索引。

故障转移群集

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

SQL Server Express

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

请参阅

其他资源