【转】使用SQL Server 2012的FileTable轻松管理文件

时间:2022-08-21 16:27:25

一 、FileStream和FileTable介绍

我们经常需要把结构化数据(int、Char等)和非结构化数据(如Varbinary(max))一起存储,那我们在怎么存储的呢?

1、 在SQL Server 2008之前,我们通常在数据库中存储结构化的数据,并且将非结构化数据(例如文档、音频、视频等)存储在NTFS文件系统中,然后在数据库中存放这些文件的路径。但是显而意见,很难保证文件系统和数据库的一致性。

2、 在SQL Server 2008,新增了FileStream,它允许我们将Varbinary(max)类型的文件存放在NTFS文件系统,但是能够直接通过SQL Server管理文件系统中的文件,有效地保证了事务的一致性。但是文件系统只是用来存储文件而已,并不能用来组织和管理文件。

3、 在SQL Server2012,在FileStream的基础之上新增了FileTable,它拥有FileStream的一切功能。并且通过Windows的文件系统能够组织和管理文件,对于文件的一切操作都会反映在SQL Server的文件表中,例如在文件系统中新建文件、新建文件夹、更改文件类型、文件大小等 ,都会相应地在SQL Server的文件表上做相应的操作。

二 、如何配置和使用FileTable

1、 在SQL Server配置管理器中开启文件流访问

a) 勾上“针对Transact-SQL访问启用FileStream”

b) 勾上“启用FileStream进行文件I/O访问”。“Windows共享名(W)”处填入“CanwaySQLFile”

c) 勾上“允许远程客户端访问FileStream数据(R)”

【转】使用SQL Server 2012的FileTable轻松管理文件

2、 在数据库的实例属性上允许访问文件流

打开“SQL Server Management Studio”,修改该实例的配置。默认配置如下:

【转】使用SQL Server 2012的FileTable轻松管理文件

将“FileStream访问级别”从“已禁用”改成“已启用完全访问”

【转】使用SQL Server 2012的FileTable轻松管理文件

其中“FileStream访问级别”有三种可选项:

a) 已禁用

无法将二进制大型对象 (BLOB) 数据存储在文件系统中。此为默认值。即filestream access level=0

b) 已启用 Transact-SQL 访问

可使用 Transact-SQL 访问 FILESTREAM 数据,但不能通过文件系统进行访问。即filestream access level=1

c) 已启用完全访问

FILESTREAM 数据可使用 Transact-SQL 以及通过文件系统进行访问。即filestream access level=0

点击“确定”之后提示必须重启SQL Server服务才会生效:

【转】使用SQL Server 2012的FileTable轻松管理文件

3、 数据库中添加文件流组和文件

a) 添加文件流组

右键数据库FileTableDB->属性->文件组,在下方的“FileStream”点击“添加”来添加一个文件流组FileStreamGroup。

【转】使用SQL Server 2012的FileTable轻松管理文件
【转】使用SQL Server 2012的FileTable轻松管理文件

b) 添加文件

添加了文件流组之后就可以在文件流组中添加数据文件

右键数据库FileTableDB->属性->文件,添加一个名为“FileTable”、文件类型为“FileStream数据”、文件组为“FileStreamGroup”、路径为“E:\FB”的数据库文件。

【转】使用SQL Server 2012的FileTable轻松管理文件

打开目录“E:\FB”,可以看到自动新建了一个文件夹“FileTable”,在FileTable文件夹下面有一个filestream.hdr文件,它是是FILESTREAM 容器的头文件

4、 数据库启用“非事务访问”和填写“FileStream目录名称”

右键数据库FileTableDB->属性->选项

a) 在“FileStream非事务访问”处选项“Full”

【转】使用SQL Server 2012的FileTable轻松管理文件

b) 在“FileStream目录名称”处填写“ImageFile”

【转】使用SQL Server 2012的FileTable轻松管理文件

点击“确定”后提示:

【转】使用SQL Server 2012的FileTable轻松管理文件

直接点击是就可以了。

5、 创建文件表FileTable

打开SSMS,打开新的查询窗口,输入以下命令并运行

【转】使用SQL Server 2012的FileTable轻松管理文件

展开数据库FileTableDB,在数据库下有一个名为FileTable的文件夹,展开此文件夹,可以看到一个名为ImageTable2并且拥有很多列的表。

【转】使用SQL Server 2012的FileTable轻松管理文件

6、 获取共享路径

在数据库FileTableDB下创建文件表ImageTable2之后,就能够通过Windows的资源管理器来看到文件表ImageTable2中存放的文件。

先获取文件表ImageTable2的共享路径,在SSMS下运行以下命令可以得到:

【转】使用SQL Server 2012的FileTable轻松管理文件

7、 通过共享路径访问数据库FileTableDB下文件表ImageTable2中存放的文件

a) 通过共享路径访问

【转】使用SQL Server 2012的FileTable轻松管理文件

目前共享文件中没有文件。

b) 查询ImageTable2

【转】使用SQL Server 2012的FileTable轻松管理文件

目录表ImageTable2也是空的

c) 在Windows资源管理器上打开上面的共享目录

i. 新建一个名为“Test.txt”的文件

【转】使用SQL Server 2012的FileTable轻松管理文件

然后再查询表ImageTable2

【转】使用SQL Server 2012的FileTable轻松管理文件

(后面还有其它字段,截图没截到)

可以发现,在共享目录下创建一个文件,那么在表ImageTable2下也会自动添加一条记录。

ii. 同样地,在数据库中删除表ImageTable2下的记录也会相应地自动删除共享目录下的文件。

【转】使用SQL Server 2012的FileTable轻松管理文件
【转】使用SQL Server 2012的FileTable轻松管理文件

iii. 在共享目录下创建文件夹也会自动地在文件表中创建一个文件夹

【转】使用SQL Server 2012的FileTable轻松管理文件
【转】使用SQL Server 2012的FileTable轻松管理文件

iv. 共享目录下修改文件的名字、增加文件的内容、更改文件的类型等都会自动地在数据库的ImageTable2下做相应的更改。

三 、总结

通过SQL Server 2012的FileTable,我们可以很方便地组织和管理存放在数据库中的文件。可以通过文件系统直接为文件建立多级目录进行分类管理,可以修改文件类型,修改文件名等,这些都不会影响到数据库和文件系统的一致性。