【转】使用SQL Server 2012的FileTable轻松管理文件
一 、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)”

2、 在数据库的实例属性上允许访问文件流
打开“SQL Server Management Studio”,修改该实例的配置。默认配置如下:

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

其中“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服务才会生效:

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


b) 添加文件
添加了文件流组之后就可以在文件流组中添加数据文件
右键数据库FileTableDB->属性->文件,添加一个名为“FileTable”、文件类型为“FileStream数据”、文件组为“FileStreamGroup”、路径为“E:\FB”的数据库文件。

打开目录“E:\FB”,可以看到自动新建了一个文件夹“FileTable”,在FileTable文件夹下面有一个filestream.hdr文件,它是是FILESTREAM 容器的头文件
4、 数据库启用“非事务访问”和填写“FileStream目录名称”
右键数据库FileTableDB->属性->选项
a) 在“FileStream非事务访问”处选项“Full”

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

点击“确定”后提示:

直接点击是就可以了。
5、 创建文件表FileTable
打开SSMS,打开新的查询窗口,输入以下命令并运行

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

6、 获取共享路径
在数据库FileTableDB下创建文件表ImageTable2之后,就能够通过Windows的资源管理器来看到文件表ImageTable2中存放的文件。
先获取文件表ImageTable2的共享路径,在SSMS下运行以下命令可以得到:

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

目前共享文件中没有文件。
b) 查询ImageTable2

目录表ImageTable2也是空的
c) 在Windows资源管理器上打开上面的共享目录
i. 新建一个名为“Test.txt”的文件

然后再查询表ImageTable2

(后面还有其它字段,截图没截到)
可以发现,在共享目录下创建一个文件,那么在表ImageTable2下也会自动添加一条记录。
ii. 同样地,在数据库中删除表ImageTable2下的记录也会相应地自动删除共享目录下的文件。


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


iv. 共享目录下修改文件的名字、增加文件的内容、更改文件的类型等都会自动地在数据库的ImageTable2下做相应的更改。
三 、总结
通过SQL Server 2012的FileTable,我们可以很方便地组织和管理存放在数据库中的文件。可以通过文件系统直接为文件建立多级目录进行分类管理,可以修改文件类型,修改文件名等,这些都不会影响到数据库和文件系统的一致性。
【转】使用SQL Server 2012的FileTable轻松管理文件的更多相关文章
- 在Windows Server 2012 R2中搭建SQL Server 2012故障转移集群
需要说明的是我们搭建的SQL Server故障转移集群(SQL Server Failover Cluster)是可用性集群,而不是负载均衡集群,其目的是为了保证服务的连续性和可用性,而不是为了提高服 ...
- SQL Server 2012新特性(1)T-SQL操作FileTable目录实例
在SQL Server 2008提供FileStream,以借助Windows系统本身的API来强化SQL Server对于非结构化数据的支持后,SQL Server 2012更是推出了像Contai ...
- SQL Server 2012 各版本功能比较
有关不同版本的 SQL Server 2012 所支持的功能的详细信息. 功能名称 Enterprise 商业智能 Standard Web Express with Advanced Service ...
- SQL Server 2012 连接到数据库引擎
第 1 课:连接到数据库引擎 https://msdn.microsoft.com/zh-cn/library/ms345332(v=sql.110).aspx 本课将介绍主要的工具以及如何连接并 ...
- 浅析基于微软SQL Server 2012 Parallel Data Warehouse的大数据解决方案
作者 王枫发布于2014年2月19日 综述 随着越来越多的组织的数据从GB.TB级迈向PB级,标志着整个社会的信息化水平正在迈入新的时代 – 大数据时代.对海量数据的处理.分析能力,日益成为组织在这个 ...
- 在SQL Server 2012中如何使用分组集
作者:Itzik Ben-Gan 翻译:张洪举 此文摘自作者的<Microsoft SQL Server 2012 T-SQL基础>. 分组集就是你据以分组的一个属性集.传统上,SQL中 ...
- 转:浅析基于微软SQL Server 2012 Parallel Data Warehouse的大数据解决方案
综述 随着越来越多的组织的数据从GB.TB级迈向PB级,标志着整个社会的信息化水平正在迈入新的时代 – 大数据时代.对海量数据的处理.分析能力,日益成为组织在这个时代决胜未来的关键因素,而基于大数据的 ...
- SQL server 2012 各个版本比较
有关不同版本的 SQL Server 2012 所支持的功能的详细信息. 功能名称 Enterprise 商业智能 Standard Web Express with Advanced Service ...
- SQLServer · 最佳实践 · 如何将SQL Server 2012降级到2008 R2-博客-云栖社区-阿里云
迁移须知 使用SQLSERVER 2012的特性在SQL 2008 R2不支持,比如新的分页方式 此迁移操作手册适用于MSSQL2012到MSSQL2008R2的迁移 迁移使用微软提供的脚本生成和导入 ...
随机推荐
- 多网卡下对ServerSocket以TCP协议绑定IP和端口的测试
一.引言:之前开发TCP协议的程序(C#里是Socket为主)都是基于主机上只有一个IP的,后来项目里涉及到了主机需要同时连接内外和外网的情况,在该主机上部署着一套WCS系统和一套WMS系统:WCS系 ...
- python 取整itertools
#coding:utf-8 import sys import itertools def MaxString(n,nums): list1 = nums list2 = [] for i in ra ...
- python+django+mysql配置步骤
安装python 详细步骤见:地址 1. 从 http://www.python.org/download/ 下载最新的python版本 (我用的是python2.6, 当时最稳定的) 2. 然后一路 ...
- Node.js是什么[译]
当我向人们介绍Node.js的时候,一般会有两种反应:多数立刻表示“哦,这样啊”,另外的则会感到困惑. 如果你是第二种的话,我会试着这样解释node: 这是一个命令行工具.你可以下载一个tar包,然后 ...
- 【最大流之ek算法】HDU1532 求最大流
本来是继续加强最短路的训练,但是遇到了一个最短路 + 最大流的问题,最大流什么鬼,昨天+今天学习了一下,应该对ek算法有所了解,凭借学习后的印象,自己完成并ac了这个最大流的模板题 题目大意:都是图论 ...
- BMDThread控件动态创建多线程示例
http://www.cnblogs.com/railgunman/archive/2010/12/08/1900688.html BMDThread控件是一套相当成熟的线程控件,使用它可以让你快速的 ...
- C++显式转换
标准C++包含一个显式的转换语法: --static_cast:用于“良性”和“适度良性”的转换,包括不用强制转换 --const_cast:用于“const”和/或“volatile”进行转换 -- ...
- js插件开发的一些感想和心得
起因 如果大家平时做过一些前端开发方面的工作,一定会有这样的体会:页面需要某种效果或者插件的时候,我们一般会有两种选择:1.上网查找相关的JS插件,学习其用法2.自己造轮子,开发插件. 寻找存在的插件 ...
- c#字典怎么获取第一个键值 List<对象>获取重复项,转成Dictionary<key,List<对象>>
c#字典怎么获取第一个键值 Dictionary<string, int> dictionary = new Dictionary<string, int>(); dictio ...
- winform程序更新
更新程序和主程序是分开的,得在做一个exe可执行更新程序. 主程序在登陆时判断是否需要更新. 我这边判断方式是直接在配置文件里面设置版本号,然后和服务器上面的版本对比,低于服务器版本就更新程序. // ...