在SQL Server 2008中,新的FILESTREAM(文件流)特性和varbinary列配合,你可以在服务器的文件系统上存储真实的数据,但可以在数据库上下文内管理和访问,这个特性让SQL Server不仅可以维护好数据库内记录的完整性,也能够维护好数据库记录和外部文件之间的完整性。因为这个特性是在现有的varbinary(max)数据类型之上实现的,开发人员可以轻易地用上这个特性,不用对应用程序的架构进行改动。
FILESTREAM使SQL Server数据库引擎和NTFS文件系统成为了一个整体。Transact-SQL语句可以插入、更新、查询、搜索和备份FILESTREAM数据。FILESTREAM使用NT系统缓存来缓存文件数据。这有助于减少FILESTREAM数据可能对数据库引擎性能产生的任何影响。由于没有使用SQL Server缓冲池,因此该内存可用于查询处理。
在SQL Server中,BLOB可以是将数据存储在表中的标准varbinary(max)数据,也可以是将数据存储在文件系统中的FILESTREAM varbinary(max)对象。数据的大小和应用情况决定您应该使用数据库存储还是文件系统存储。如果满足以下条件,则应考虑使用FILESTREAM:
- 所存储的对象平均大于1MB。
- 快速读取访问很重要。
- 您开发的是使用中间层作为应用程序逻辑的应用程序。
对于较小的对象,将varbinary(max)BLOB存储在数据库中通常会提供更为优异的流性能。
FILESTREAM存储以varbinary(max)列的形式实现,在该列中数据以BLOB的形式存储在文件系统中。BLOB的大小仅受文件系统容量大小的限制。文件大小为2GB的varbinary(max)标准限制不适用于存储在文件系统中的BLOB。
若要将指定列使用FILESTREAM存储在文件系统中,对varbinary(max)列指定FILESTREAM属性。这样数据库引擎会将该列的所有数据存储在文件系统,而不是数据库文件中。
FILESTREAM数据必须存储在FILESTREAM文件组中。FILESTREAM文件组是包含文件系统目录而非文件本身的专用文件组。这些文件系统目录称为“数据容器”。数据容器是数据库引擎存储与文件系统存储之间的接口。
使用FILESTREAM存储时,需要注意以下内容:
- 如果表包含FILESTREAM列,则每一行都必须具有唯一的行ID。
- 不能嵌套FILESTREAM数据容器。
- 使用故障转移群集时,FILESTREAM文件组必须位于共享磁盘资源上。
- FILESTREAM文件组可位于压缩卷上。
启用FILESTREAM(文件流)
默认情况下,FILESTREAM(文件流)特性是被禁用了的,因此在使用之前,你必须按照下面的步骤配置服务器和数据库实例:
1、要启用服务器实例上的FILESTREAM(文件流),打开SQL Server配置管理器,在SQL Server服务上点击右键,然后点击打开,你会看到一串服务器,在你想要启用FILESTREAM(文件流)的SQL Server实例上点击右键,从右键菜单中选择“属性”,切换到FILESTREAM(文件流)标签,检查“为Transact-SQL访问启用FILESTREAM(文件流)”选项,你也可以在这个标签页为文件I/O流访问启用FILESTREAM(文件流)。
2、要为数据库实例启用FILESTREAM(文件流),执行系统存储过程sp_configure,并设置filestream_access_level参数的值为2,如下:
EXEC sp_configure filestream_access_level, 2
GO
RECONFIGURE
GO
filestream_access_level参数有效的值包括:
◆ 0 在该实例上禁用FILESTREAM(文件流),这是默认值。
◆ 1 为Transact-SQL访问启用FILESTREAM(文件流)
◆ 2 为Transact-SQL和Win32流访问启用FILESTREAM(文件流)
完成服务器和数据库实例配置后,接下来是创建存储数据的真实数据库,因为FILESTREAM(文件流)是专门为存储在文件系统上的二进制数据创建的
3、打开SSMS连接到数据库实例,右击数据库实例,选择“属性”选项,系统将打开SQL Server实例的属性窗口。
4、切换的“高级”选项页,在文件流访问级别下拉列表框中选择“已启用完全访问”选项,如图所示。
5、单击“确定”按钮,然后重启数据库实例,FILESTREAM在数据库实例中设置完成。
在启用了数据库实例的FILESTREAM后,接下来就需要设置数据库的FILESTREAM和创建具有FILESTREAM数据列的表:
6、对应新建的数据库,则在创建数据库时创建FILESTREAM文件组,如果是现有数据库,则使用ALTER DATABASE添加FILESTREAM的文件组,例如对TestDB1数据库添加FILESTREAM的文件组,具体SQL脚本如代码:
ALTER DATABASE [sq_shuntcn]
ADD FILEGROUP [FileStreamGroup] CONTAINS FILESTREAM --添加FILESTREAM文件组
GO
ALTER DATABASE [sq_shuntcn]
ADD FILE ( NAME = N'FileStream', FILENAME = N'C:\FileStream') --添加FILESTREAM文件
TO FILEGROUP [FileStreamGroup]
GO
系统将自动创建C:\FileStream文件夹并在其中写入filestream.hdr文件,该文件是 FILESTREAM容器的头文件不能删除,一定要确保在运行该语句之前C:\FileStream并不存在。
7、创建了FILESTREAM文件组后便可创建和修改表,指定某varbinary(max)类型的列包含FILESTREAM数据。例如创建Files表,该表包含FileID和FIleContent列,具体脚本如代码:
CREATE TABLE PhotoAlbum(
PhotoId int PRIMARY KEY,
RowId uniqueidentifier ROWGUIDCOL NOT NULL UNIQUE DEFAULT NEWID(),
Description varchar(max),
Photo varbinary(max) FILESTREAM DEFAULT(0x)
)
按照msdn说明,RowId
列是一个ROWGUIDCOL列,Photo
作为文件存储的列不仅是VARBINARY(MAX)类型 ,同时还需要赋予一个fileStream特性
在创建好FILESTREAM表后即可向其中添加、修改和读取数据。SQL Server支持使用T-SQL和WIN32 API两种方式访问FILESTREAM。
对于T-SQL访问FILESTREAM数据列来说,FILESTREAM是完全透明的,也就是说,T-SQL仍然使用一般的访问varbinary(max)数据列的方式访问,并不会因为是FILESTREAM列而有所不同。
代码访问FILESTREAM数据列参考文章 Using SqlFileStream with C# to Access SQL Server FILESTREAM Data