在SQL2008中如何建立数据库并定义文件流FILESTREAM?
一、全新安装数据库并定义文件流FILESTREAM:
首先安装SQL2008开发版,序列号是,安装时启用FILESTREAM选项。
安装完成后在windows资源管理器的系统盘中新建目录C:/Data用来指定数据库存储目录,然后我们新建数据库Archive并定义文件流FILESTREAM,在数据库Archive中包含了三个文件,数据库主文件archdat1.mdf,日志文件archlog1.ldf以及FILESTREAM类型的FileStreamGroup1文件组。
在查询编辑器中执行以下脚本:
CREATE DATABASE Archive
ON
PRIMARY ( NAME = Arch1,
FILENAME = 'c:/data/archdat1.mdf'),
FILEGROUP FileStreamGroup1 CONTAINS FILESTREAM( NAME = Arch3,
FILENAME = 'c:/data/filestream1')
LOG ON ( NAME = Archlog1,
FILENAME = 'c:/data/archlog1.ldf')
GO
我们可以看到在文件组FileStreamGroup1中,文件名指向c:/data/filestream1目录。需要注意的是c:/data目录必须存在,而filestream1目录不能已经存在,否则会提示无法创建文件'c:/data/filestream1',因为它已存在。新建完数据库Archive,在c:/data/filestream1中会自动生成filestream.hdr文件。
二、在FileStreamGroup1文件组中,如何存储FILESTREAM类型数据?
首先新建表Records,在该表中指定ID列类型为ROWGUIDCOL,用于win32 API使用FILESTREAM数据时使用它。若要新建包含FILESTREAM功能的数据字段时必须具备唯一且不可为NULL的Uniqueidentifier类型字段,可以是ROWGUIDCOL PRIMARY KEY或ROWGUIDCOL NOT NULL UNIQUE。在查询编辑器中执行如下脚本:
CREATE TABLE Archive.dbo.Records
(
[Id] [uniqueidentifier] ROWGUIDCOL NOT NULL UNIQUE,
[SerialNumber] INTEGER UNIQUE,
[Chart] VARBINARY(MAX) FILESTREAM NULL
)
GO
指定Chart列为FILESTREAM类型数据。新建完毕在c:/data/filestream1目录中自动生成存储表数据的文件夹,比如
C:/data/filestream1/8a5dbb45-8d1e-4300-9181-1bdb9b252466/d5a9c5f7-c085-43ad-95b6-dd16b0b0aeef
在Records表中新增数据,在FILESTREAM列中可以插入 NULL 或 varbinary(max) 值。在查询编辑器中执行如下脚本:
INSERT INTO Archive.dbo.Records VALUES (newid (), 1, NULL);
如果 FILESTREAM 值为 NULL,则数据库引擎不会在文件系统中创建文件。
在查询编辑器中执行如下脚本:
INSERT INTO Archive.dbo.Records VALUES (newid (), 2,
CAST ('' as varbinary(max)));
如果 FILESTREAM 值为 ‘’即长度为0的记录,则数据库引擎会在文件系统中创建大小为0KB的文件。
在查询编辑器中执行如下脚本:
INSERT INTO Archive.dbo.Records VALUES (newid (), 3,
CAST ('Seismic Data' as varbinary(max)));
数据库引擎将字符串 Seismic Data 转换为 varbinary(max) 值。如果 Windows 文件尚未存在,FILESTREAM 将创建该文件。然后,在数据文件中添加数据。
此时,已经在Records表中新增真实数据Seismic Data,我们在数据库中查询SerialNumber列等于3的记录时,会发现Seismic Data被转换为varbinary的值如下:
Chart
0x536569736D69632044617461
用notepad打开
C:/data/filestream1/8a5dbb45-8d1e-4300-9181-1bdb9b252466/d5a9c5f7-c085-43ad-95b6-dd16b0b0aeef/00000014-0000014e-0004文件显示Seismic Data数据。如下图所示
我们可以利用win32 API读取 FILESTREAM 文件路径。在查询编辑器中执行如下脚本:
DECLARE @filePath varchar(max)
SELECT @filePath = Chart.PathName()
FROM Archive.dbo.Records
WHERE SerialNumber = 3
PRINT @filepath
会得到该文件的路径。比如
//IT-211/SQLEXPRESS/v1/Archive/dbo/Records/Chart/EAD5D3C5-8AD5-49A6-B494-11B49501B4C6
其中EAD5D3C5-8AD5-49A6-B494-11B49501B4C6就是Records表中对应记录的ID值。同样对于FILESTREAM列的更新和删除等与正常表操作一致,这里不继续说明。
三、在已有数据库中如何新建定义文件流FILESTREAM?
假设已有数据库Archive2,其只有archdat2.mdf主文件和archlog2.ldf日志文件。我们希望添加FileStreamGroup2文件组并定义文件流Arch4的物理路径为c:/data/filestream2。这里仍要注意(前面已提示)数据库目录c:/data必须存在,而文件流目录不能存在。
在查询编辑器中执行以下脚本:
CREATE DATABASE Archive2
ON
PRIMARY ( NAME = Arch2,
FILENAME = 'c:/data/archdat2.mdf')
LOG ON ( NAME = Archlog2,
FILENAME = 'c:/data/archlog2.ldf')
GO
已新建Archive2空数据库。
在查询编辑器中执行以下脚本:
ALTER database Archive2
ADD FILEGROUP FileStreamGroup2
CONTAINS FILESTREAM
GO
ALTER database Archive2
ADD FILE
(
NAME= 'Arch4',
FILENAME = 'C:/data/filestream2'
)
TO FILEGROUP FileStreamGroup2
GO
分别新建FileStreamGroup2文件组包含FILESTREAM数据,再定义文件流及物理路径。
资料参考:http://msdn.microsoft.com