SQL2008中建立数据库并定义文件流FILESTREAM

在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

posted @ 2013-03-29 16:40  纯真天宇  阅读(353)  评论(0编辑  收藏  举报