FileStream:文件流,为了解决大对象BLOB(Binary Large Objects)的存储问题.对于大对象存储,并且不受2GB的限制. 以往有两种方式: (1)存储在数据库里面,这种方式一般使用image字段,或者varbinary(max)来做,好处是可以统一备份,但实际效率较低; (2)存储在文件系
FileStream:文件流,为了解决大对象BLOB(Binary Large Objects)的存储问题.对于大对象存储,并且不受2GB的限制.
以往有两种方式:
(1)存储在数据库里面,这种方式一般使用image字段,或者varbinary(max)来做,好处是可以统一备份,但实际效率较低;
(2)存储在文件系统,而数据库中存储文件路径,这种方式数据库压力减轻了,但却不方便统一备份和管理.
SQL SERVER 2008新引入的文件流就是两者的统一.文件还是放在文件系统,但由数据库进行管理,可以统一备份和还原.
如何使用FileStream?
一.启用FileStream
(1)在SQL Server配置管理器中打开SQL Server数据库引擎的属性窗口.
(2)切换到FILESTREAM选项卡,选中”针对Transact-SQL访问启用FILESTREAM”,其他选项是针对windows进行读写的,都可以选中.
(3)打开SSMS连接到数据库实例(是实例,不是具体的数据库),右击数据库实例,选择”属性”选项,切换到”高级”选项页,在文件流访问级别下拉列表框中选择”已启用完全访问”
二.初始化环境
(1)添加文件组
ALTER DATABASE [DBName] ADD FILEGROUP [FileGrp1] CONTAINS FILESTREAM
(2)添加存放文件的路径
ALTER DATABASE [DBName] ADD FILE(Name=N’filestream’,FILENAME=N’C:/FileStream’) TO FILEGROUP [FileGrp1]
系统将自动创建C:/FileStream文件夹并在其中写入filestream.hdr文件,该文件是 FILESTREAM容器的头文件不能删除,一定要确保在运行该语句之前C:/FileStream并不存在。
注意:文件组必须定义在NTFS格式分区下的磁盘,并且需要指向本地文件系统位置上,不允许指向网络地址network addressable storage (NAS),除非通过 iSCSI将NAS设备设置为本地NFS卷
原文(the DBA must define a database filegroup that ties an NTFS file system location to a SQL Server database. Note that the filegroup needs to point to a local file system location; filestreams can’t live on a remote server or a network addressable storage (NAS) devices unless the NAS device is presented as a local NFS volume via iSCSI)
如数据库之前从未备份过,在执行以上语句时会提示须先备份LOG
三.模拟测试
(1)建表
CREATE TABLE FileStreamTest
(
ID uniqueidentifier ROWGUID NOT NULL UNIQUE DEFAULT NewID(),
FilesName varbinary(max) FILESTREAM NULL
)
FILESTREAM_ON [FileGrp1] –指示存储到哪一个文件流
*如果一个表要使用文件流,则必须有一个GUID列,且作为唯一键列
(2)测试数据
INSERT INTO FileStreamTest(FilesName) VALUES (CAST(‘Edwin.Koo’ AS varbinary(max)))
UPDATE FileStreamTest Set FilesName= (select txt_data From OPEMROWSET( BULK ‘C:/temp/file01.txt’,SINGLE_CLOB) As F(txt_data)) WHERE ID=’BDBF1376-5CFA-43D来4源gaodaimacom搞#代%码*网7-B906-4B7C8E9A7625′
对于T-SQL访问FileStream数据列是完全透明的,就如访问varbinary(max)的方式一样.
值得注意的是:无论是插入数据还是修改数据,SQL Server都将在文件系统中创建新的文件来保存最新的修改文件内容,修改或删除数据后文件系统中的文件将保留,而不会被同时删除。
<style> .CodeEntity .code_pieces ul.piece_anchor{width:25px;position:absolute;top:25px;left:-30px;z-index:1000;} .CodeEntity .code_pieces ul.piece_anchor li{width:25px;background: #efe;margin-bottom:2px;} .CodeEntity .code_pieces ul.piece_anchor li{border-left:3px #40AA63 solid;border-right:3px #efe solid;} .CodeEntity .code_pieces ul.piece_anchor li:hover{border-right:3px #40AA63 solid;border-left:3px #efe solid;} .CodeEntity .code_pieces ul.piece_anchor li a{color: #333;padding: 3px 10px;} .CodeEntity .code_pieces .jump_to_code{visibility:hidden;position:relative;} .CodeEntity .code_pieces .code_piece:hover .jump_to_code{visibility:visible;} .CodeEntity .code_pieces .code_piece:hover .jump_to_code a{text-decoration:none;} .CodeEntity .code_pieces h2 i{float:right;font-style:normal;font-weight:normal;} .CodeEntity .code_pieces h2 i a{font-size:9pt;background: #FFFFFF;color:#00A;padding: 2px 5px;text-decoration:none;} </style> <!—ecms -ecms
- –> <!—ecms -ecms
- $velocityCount
–> <!—ecms -ecms
–>
ALTER DATABASE [DBName] ADD FILEGROUP [FileGrp1] CONTAINS FILESTREAM
ALTER DATABASE [DBName] ADD FILE(Name=N'filestream',FILENAME=N'C:/FileStream') TO FILEGROUP [FileGrp1]
CREATE TABLE FileStreamTest(ID uniqueidentifier ROWGUID NOT NULL UNIQUE DEFAULT NewID(),FilesName varbinary(max) FILESTREAM NULL)FILESTREAM_ON [FileGrp1] --指示存储到哪一个文件流
INSERT INTO FileStreamTest(FilesName) VALUES (CAST('Edwin.Koo' AS varbinary(max)))UPDATE FileStreamTest Set FilesName= (select txt_data From OPEMROWSET( BULK 'C:/temp/file01.txt',SINGLE_CLOB) As F(txt_data)) WHERE ID='BDBF1376-5CFA-43D7-B906-4B7C8E9A7625'