1. 首先要在实例级别启用FILESTREAM,打开Sql Server Configuration Manager窗口,双击需要设置的SQL SERVER实例进行设置。

2. 需要更改 SQL SERVER 实例的 FILESTREAM 访问级别,执行以下代码,并重启 SQL SERVER 服务:

EXEC sp_configure filestream_access_level, 2
RECONFIGURE
GO

参数定义如下:

3. 有可能需要防火墙配置为进行 FILESTREAM 访问,若要在防火墙保护的环境中使用 FILESTREAM,客户端和服务器都必须能够将 DNS 名称解析为包含 FILESTREAM 文件的服务器。FILESTREAM 要求 Windows 文件共享端口 139 和 445 处于打开状态。

4. 以上都准备好了后就可以在创建数据库时创建 FILESTREAM 文件组了,执行以下代码:

--    创建数据库时创建 FILESTREAM 文件组
CREATE DATABASE Archive
ON
PRIMARY (
NAME = ArchiveMDF,
FILENAME = 'D:\DataBase\ZL\Archive\archdat.mdf', -- D:\DataBase\ZL\Archive路径必须存在
SIZE = 5MB,
MAXSIZE = 25MB,
FILEGROWTH = 5MB
),
FILEGROUP FileStreamGroupFirst CONTAINS FILESTREAM(
NAME = ArchiveFILESTREAM,
FILENAME = 'D:\DataBase\ZL\Archive\MyFileStream', -- D:\DataBase\ZL\Archive路径下MyFileStream文件夹必须不存在
MAXSIZE = 50 MB
)
LOG ON (
NAME = ArchiveLDF,
FILENAME = 'D:\DataBase\ZL\Archive\archlog.ldf'
)
WITH FILESTREAM ( NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'MyDirectory' ) -- 指定数据库访问级别和指定目录名字
GO

WITH FILESTREAM() 选项是用来指定对数据库的非事务性FILESTREAM访问的级别,说明如下:

执行成功后在目录里就生成了 FILESTREAM 文件夹。

当然也可以为已存在的数据库添加 FILESTREAM 文件组,代码如下:

--    或者在当前数据库中添加 FILESTREAM 文件组
ALTER DATABASE zl_test
ADD FILEGROUP FileStreamGroup CONTAINS FILESTREAM; ALTER DATABASE zl_test
ADD FILE
(
NAME = FileStreamFile,
FILENAME = 'D:\DataBase\ZL\zl_test\MyFileStream',
MAXSIZE = 50 MB
)
TO FILEGROUP FileStreamGroup
GO

如果在创建数据库时没有用 WITH FILESTREAM 语句来指定非事务性访问级别,可以在之后单独用语句来进行,比如:

--    在数据库级别上指定 非事务性访问级别 和 FileTable目录(数据库须独占)
ALTER DATABASE zl_test
SET FILESTREAM ( NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'MyDirectoryZl')

注意,执行以上语句必须没有其他进程连接到被操作数据库上才能成功,否则将无限等待直至其他连接断开。可以用下面的语句查看所有连接到该数据库上的进程:

select * from master..sysprocesses where dbid=db_id('zl_test')

然后结束其他进程即可:

kill 56

用下面的语句可以查看当前实例中哪些数据库已经设置了非事务性访问级别,和FileTable目录名:

--    启用后即可查看到其状态信息
SELECT DB_NAME(database_id) [database],non_transacted_access, non_transacted_access_desc
FROM sys.database_filestream_options
WHERE non_transacted_access_desc <> 'OFF' SELECT DB_NAME(database_id) [database],directory_name
FROM sys.database_filestream_options
WHERE directory_name IS NOT NULL

返回结果如下:

5. 在新建的 Archive 数据库中创建 FileTable,语句如下:

--  创建FILETABLE
USE Archive
GO
CREATE TABLE [FileStore]
AS FileTable
WITH (
--文件目录,不区分大小写,不指定则默认为filetable名称[FileStore]
FileTable_Directory = N'FileStore_Dev',
FileTable_Collate_Filename = database_default --排序规则
)
GO

执行成功后在对象浏览器中可以看到

FileTable 是专用的用户表,它具有预定义的固定架构。 此架构存储 FILESTREAM 数据、文件和目录信息以及文件属性。由于FileTable有固定的结构,所以不必指定字段名。创建FileTable的简单语法可以指定以下设置:

  1). FILETABLE_DIRECTORY。指定充当存储在 FileTable 中的所有文件和目录的根目录的目录。 此名称应在数据库的所有 FileTable 目录名称中唯一。 无论当前排序规则设置如何,唯一性比较都不区分大小写。如果创建 FileTable 时没有提供目录名称,则 FileTable 自身的名称将用作目录名称。

  2). FILETABLE_COLLATE_FILENAME。指定要应用于 FileTable 的“名称”列的排序规则名称。如果未提供 FILETABLE_COLLATE_FILENAME 的值,或指定了 database_default,则该列继承当前数据库的排序规则。 如果当前数据库排序规则区分大小写,将引发错误,CREATE TABLE 操作将失败。

  3). 还可以指定要用于三个主键的名称和自动创建的唯一约束。 如果不提供名称,则系统会生成名称

    a. FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME

    b. FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME

    c. FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME

也可以用语句来更改FileTable的目录,比如:

ALTER TABLE dbo.FileStore
SET ( FILETABLE_DIRECTORY = N'FileStore_Pro' )

右击创建好的FileTable,选择Explore FileTable Directory,可以在文件系统中打开FileTable的目录,现在目录里是空的,

红线划起来的就是前面创建数据库时 WITH FILESTREAM 语句中指定的DIRECTORY_NAME值

WITH FILESTREAM ( NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'MyDirectory' ),由于一个实例中可能有多个数据库都有FileTable,所以这个值必须唯一。

蓝线划起来的就是上面创建FileTable时 WITH() 选项中指定的值

FileTable_Directory = N'FileStore_Dev',由于在一个数据库中可能存在多个FileTable,所以这个值在同一个数据库中必须唯一,但不同的数据库中可以相同。

往目录里存放一些文件或文件夹,

查询FileTable表,看见表中已经产生了对应的数据。

在目录中删掉某些文件则表中也会相应自动的删掉某些数据,同样在表中删掉某些数据,则目录中也会相应自动的删掉某些文件。

6. 可以用下图的语句获取特定 FileTable 或当前数据库的根级 UNC 路径:

-- returns “\\SZSAUDIT\MSSQLSERVER\MyDirectory”
SELECT FileTableRootPath(); -- returns “\\SZSAUDIT\MSSQLSERVER\MyDirectory\FileStore”
SELECT FileTableRootPath(N'dbo.FileStore');

返回的结果,

可以用下面的语句返回FileTable中指定的文件或目录Locator ID值。

select GetPathLocator(FileTableRootPath('[dbo].[FileStore]')+'\ASRData.pdf')
select GetPathLocator('\\Szsaudit\mssqlserver\MyDirectory\FileStore\ASRData.pdf')

7. 下面是一些关于创建和操作FileTable的其他说明,详见MSDN。

  1).不能更改现有表以将其转换为 FileTable。

  2).先前在数据库级别指定的父目录还必须具有非 Null 值。

  3).由于一个FileTable 包含一个 FILESTREAM 列,因此,FileTable 需要有效的 FILESTREAM 文件组。 可以指定有效的 FILESTREAM 文件组作为 CREATE TABLE 命令的一部分以创建 FileTable(可选)。 如果未指定文件组,则 FileTable 使用数据库的默认 FILESTREAM 文件组。 如果数据库没有 FILESTREAM 文件组,将引发错误。

  4).不能将表约束作为 CREATE TABLE…AS FILETABLE 语句的一部分创建。 但是以后可以使用 ALTER TABLE 语句添加该约束。

  5).不能在 tempdb 数据库或任何其他系统数据库中创建 FileTable。

不能将 FileTable 作为临时表创建。

  6).不能更改FILETABLE_COLLATE_FILENAME的值。

  7).不能更改,删除或禁用FileTable的系统定义的列。不能将新的用户列、计算列或持久化计算列添加到 FileTable。

  8).删除FileTable时,将删除 FileTable 的所有列以及与该表关联的所有对象,如索引、约束和触发器。

  9).删除FileTable时,FileTable 目录及其子目录将从数据库的 FILESTREAM 文件和目录层次结构中消失。

  10).FileTable上的INSERT操作

    a.所有文件属性列具有 NOT NULL 约束。如果没有显式设置值,则提供适当的默认值。

    b.如果 INSERT 语句设置了 name、path_locator、parent_path_locator 或文件属性,则强制执行系统定义的约束。

    c.该应用程序可以通过提供指向 GetPathLocator 函数的系统文件路径,来获取文件或目录的 path_locator。

  11).FileTable上的UPDATE操作

    a.允许更新任何用户定义的数据。

    b.如果 INSERT 语句设置了 name、path_locator、parent_path_locator 或文件属性,则强制执行系统定义的约束。

    c.可以对 file_stream 列中的 FILESTREAM 数据进行更新,且不会影响任何其他列(包括时间戳)。

  12).FileTable上的DELETE操作

    a.删除行还将从文件系统中删除相应的文件或目录。

    b.如果该行与包含其他文件或目录的目录相对应,则删除行操作将失败。

  13).FileTable不支持分区。通过对多个FILESTREAM文件组的支持,在大多数方案中可以解决纯向上扩展问题,而不必使用分区。

  14).FileTable不支持复制和相关功能,包括事务复制,合并复制,更改数据捕获和更改跟踪。

建议创建FileTable所在的数据库最好不要是现有的业务数据库,新建一个数据库来单独创建FileTable比较好。

FileTable的创建和使用的更多相关文章

  1. [SQLServer大对象]——FileTable初体验

    阅读导航 启用FILESTREAM设置 更改FILESTRAM设置 启用数据库非事务性访问级别 FileTable 在我接触FileTable之前,存储文件都是存储文件的链接和扩展名到数据,其实并没有 ...

  2. SQL Server 2012新特性(1)T-SQL操作FileTable目录实例

    在SQL Server 2008提供FileStream,以借助Windows系统本身的API来强化SQL Server对于非结构化数据的支持后,SQL Server 2012更是推出了像Contai ...

  3. SQL2012之FileTable与C#的联合应用

    关于FileTable是什么,请猛击如下链接:http://technet.microsoft.com/zh-cn/library/ff929144(v=SQL.110).aspx:如您已知道,请跳过 ...

  4. 批量创建采购订单 BAPI_PO_CREATE1

    *&---------------------------------------------------------------------* *& REPORT  ZMM_PO_C ...

  5. FileTable初体验

    FileTable初体验 阅读导航 启用FILESTREAM设置 更改FILESTRAM设置 启用数据库非事务性访问级别 FileTable 在我接触FileTable之前,存储文件都是存储文件的链接 ...

  6. [SQLServer大对象]——FileTable初体验 (转载)

    阅读导航启用FILESTREAM设置更改FILESTRAM设置启用数据库非事务性访问级别FileTable 在我接触FileTable之前,存储文件都是存储文件的链接和扩展名到数据,其实并没有实际的把 ...

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

    一 .FileStream和FileTable介绍 我们经常需要把结构化数据(int.Char等)和非结构化数据(如Varbinary(max))一起存储,那我们在怎么存储的呢? 1. 在SQL Se ...

  8. SQL Server ->> FileTable

    FileTable是SQL Server 2012的新特性之一.它是基于SQL Server 2008的FILESTREAM特性上而来的,允许我们把Windows文件存储在SQL Server中,让S ...

  9. SQL SERVER 2012文件表(FILETABLE)新体验之一

    SQLSERVER 2012 文件表功能很COOL,让我们体验一下吧. 1,创建数据库 [sql] DREATE DATABASE FileTableTest ON  PRIMARY (     NA ...

随机推荐

  1. redis实战笔记(6)-第6章 使用 Redis构建应用程序组件

    本章主要内容   1.构建两个前缀匹配自 动补全程序 2.通过构建分布式锁来提高性能 3.通过开发计数信号量来控制并发 4.构建两个不同用途的任务队列 5.通过消息拉取系统来实现延迟消息传递 6.学习 ...

  2. Oracle驱动classes12.jar 与ojdbc14.jar的区别

    简单的说,如果使用jdk1.2和jdk1.3就使用classes12.jar:如果使用的jdk1.4和jdk1.5的,就选用ojdbc14.jar. 驱动包classes12.jar用于JDK 1.2 ...

  3. [转载]常见的移动端H5页面开发遇到的坑和解决办法

    转过来,平时看看.虽然还有很多问题至今无解.比如:华为麒麟950的P8和meta打开我们的应用首页经常偶发白屏.!! 1.安卓浏览器看背景图片,有些设备会模糊. 用同等比例的图片在PC机上很清楚,但是 ...

  4. [转]Asp.Net 网站多语言解决方案

    本文转自:https://www.cnblogs.com/FredTang/archive/2013/01/23/2873231.html 最近领导要求实现PMSWeb应用程序的多区域语言的支持,所以 ...

  5. DOM (文档对象模型(Document Object Model))

    文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口.在网页上,组织页面(或文档)的对象被组织在一个树形结构中,用来表示文档中对象 ...

  6. Jquery 筛选选择器

    筛选选择器(方法) 既然是方法 那就应该对象调用   obj.metch(); $(“.dd”).children("ul"),show();           //找到.dd下 ...

  7. 常常忘记但是很重要的sql语句

    一.基础1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份 ...

  8. [疑难杂症]解决实际开发中各种问题bug

    我有一个习惯就是遇到问题找到解决方案后收藏网页.后来遇到问题越来越多,收藏就多得有点离谱了.我反思了一下,其实有用的信息就那么点,那我干脆还是做成网页剪报好了. 关于VS的 Problem:未能正确加 ...

  9. ASP.NET MVC扩展库

    很多同学都读过这篇文章吧 ASP.NET MVC中你必须知道的13个扩展点,今天给大家介绍一个ASP.NET MVC的扩展库,主要就是针对这些扩展点进行.这个项目的核心是IOC容器,包括Ninject ...

  10. 针对多类型数据库,集群数据库的有序GUID

    一.背景 常见的一种数据库设计是使用连续的整数为做主键,当新的数据插入到数据库时,由数据库自动生成.但这种设计不一定适合所有场景. 随着越来越多的使用Nhibernate.EntityFramewor ...