SQL Server 2012 提供一种特殊的“文件表”,也称为“FileTable”。 FileTable 是一种专用的用户表,它包含存储 FILESTREAM 数据的预定义架构以及文件和目录层次结构信息、文件属性。FileTable 功能为 SQL Server 中存储的文件数据提供对 Windows 文件命名空间的支持以及与 Windows 应用程序的兼容性支持。即可以在 SQL Server 中将文件和文档存储在称作 FileTable 的特别的表中,但是从 Windows 应用程序访问它们,就好像它们存储在文件系统中,而不必对客户端应用程序进行任何更改。

在实例级别启用 FILESTREAM:(参考 启用和配置 FILESTREAM )

右键SQLserver服务——属性——FILESTREAM ——勾选——重启服务

更改此 SQL Server 实例的 FILESTREAM 访问级别 :(参考 filestream access level 服务器配置选项)

1
2
exec sp_configure N'filestream access level' ,2
reconfigure with override

可能需要配置将防火墙配置为进行 FILESTREAM 访问。

数据库级别创建 FILESTREAM 文件组:

数据库必须首先具有 FILESTREAM 文件组,然后您才能在该数据库中创建 FileTable。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
--  创建数据库时创建 FILESTREAM 文件组
CREATE DATABASE FileStreamDB
ON
PRIMARY (
    NAME = FileStreamDB,
    FILENAME = 'G:\database\FileStreamDB.mdf',
    SIZE = 5MB,
    MAXSIZE = 25MB,
    FILEGROWTH = 5MB
),
FILEGROUP FileStreamGroup CONTAINS FILESTREAM(
     NAME = FileStreamFile,
     FILENAME = 'G:\database\FileStreamFile',
     MAXSIZE = 50 MB
)
LOG ON (
    NAME = FileStreamDB_log,
    FILENAME = 'G:\database\FileStreamDB_log.ldf'
)
WITH FILESTREAM ( NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'FileStreamPath' )
GO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
--  或者在当前数据库中添加 FILESTREAM 文件组
ALTER DATABASE [AdventureWorks2012]
ADD FILEGROUP FileStreamGroup CONTAINS FILESTREAM;
 
 
ALTER DATABASE [AdventureWorks2012]
ADD FILE
(
     NAME = FileStreamFile,
     FILENAME = 'G:\database\FileStreamFile',
     MAXSIZE = 50 MB
)
TO FILEGROUP FileStreamGroup
GO

创建文件时 filename 只指定目录,并且目录 FileStreamFile 在文件系统不存在,创建后会自动生成该目录文件夹

在数据库级别上指定 非事务性访问级别 和 FileTable目录(数据库须独占):

1
2
3
4
5
6
7
8
9
10
11
12
--  在数据库级别上指定 非事务性访问级别 和 FileTable目录(数据库须独占)
ALTER DATABASE [AdventureWorks2012]
SET FILESTREAM ( NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'FileStreamPath' )
 
--  启用后即可查看到其状态信息
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

将新表创建为 FileTable :(参考 CREATE TABLE (Transact-SQL) )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
USE [AdventureWorks2012]
GO
CREATE TABLE [DocumentStore]
AS FileTable
WITH (
    --文件目录,不区分大小写,不指定则为filetable名称[DocumentStore]
    FileTable_Directory = N'FileStreamPath',
    FileTable_Collate_Filename = database_default   --排序规则
);
GO
 
--  更改目录
ALTER TABLE [DocumentStore]
    SET ( FILETABLE_DIRECTORY = N'FileStreamPath' );
GO

每个目录创建都会在文件系统中生成一个文件夹:

相关查询:(FileTable 架构)

1
2
3
4
5
6
7
8
9
--  查看 FileTable 信息
SELECT * FROM sys.filetables;
SELECT * FROM sys.tables WHERE is_filetable = 1;
 
--  FileTable 的相关对象
SELECT parent_object_id,OBJECT_NAME(parent_object_id) AS 'FileTable'
,object_id,OBJECT_NAME(object_id) AS 'System-defined Object'
FROM sys.filetable_system_defined_objects
ORDER BY FileTable, 'System-defined Object';

至此,已经配置完成!~

现在查看文件表,没有记录。可以查看该表的 UNC 路径,在系统文件中打开该路径。

1
2
3
4
5
6
7
--  查看 FileTable
SELECT * FROM [dbo].[DocumentStore]
 
--  获取特定 FileTable 或当前数据库的根级 UNC 路径。
SELECT FileTableRootPath();
SELECT FileTableRootPath(N'DocumentStore');
SELECT FileTableRootPath(N'dbo.DocumentStore');

在该路径中,可以直接将系统其它文件拷贝进去:

再查看 FileTable ,数据已经自动记录

1
2
--  查看 FileTable
SELECT * FROM [dbo].[DocumentStore]

1
2
3
4
5
--  也可以用GetFileNamespacePath查看 FileTable 中文件或目录的 UNC 路径。
SELECT
 file_stream.GetFileNamespacePath()
,file_stream.GetFileNamespacePath(1, 0)
FROM [dbo].[DocumentStore]

删除表 FileTable 中的记录,文件也会被删除:

1
2
3
4
--  删除表 FileTable 中的记录,文件也会被删除
DELETE FROM [dbo].[DocumentStore] WHERE stream_id = 'BA483ECA-AE0E-E511-8367-005056C00008'
 
SELECT * FROM [dbo].[DocumentStore]

若要获取执行某些管理任务所需的独占访问权限,可能必须暂时禁用非事务性访问权限。

禁用完全非事务性访问权限:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ALTER DATABASE [AdventureWorks2012]
    SET FILESTREAM ( NON_TRANSACTED_ACCESS = OFF );
GO
--  关闭后,路径无法打开
--  \\Kk-pc\mssqlserver\FileStreamPath\FileStreamPath
--  此时文件表 [DocumentStore] 仍可正常操作
 
 
ALTER DATABASE [AdventureWorks2012]
    SET FILESTREAM ( NON_TRANSACTED_ACCESS = READ_ONLY );
GO
--  只读状态,路径可拷贝文件出来,但无法拷贝文件到该目录
--  \\Kk-pc\mssqlserver\FileStreamPath\FileStreamPath
--  此时文件表 [DocumentStore] 仍可正常操作

重新启用完全非事务性访问权限:

1
2
3
4
--  重新启用完全非事务性访问权限
ALTER DATABASE [AdventureWorks2012]
    SET FILESTREAM ( NON_TRANSACTED_ACCESS = FULL );
GO

禁用 FileTable 命名空间将会禁用所有系统定义的约束并触发使用 FileTable 创建的约束。

1
2
3
4
--  禁用 FileTable 命名空间
--  (禁用后路径 \\Kk-pc\mssqlserver\FileStreamPath\FileStreamPath 不可访问)
ALTER TABLE [DocumentStore] DISABLE FILETABLE_NAMESPACE;
GO
1
2
3
--  重新启用 FileTable 命名空间
ALTER TABLE [DocumentStore] ENABLE FILETABLE_NAMESPACE;
GO

更多注意的事情还需要到参考官方文档:FileTable 与其他 SQL Server 功能的兼容性

SqlServer2012 File Table文件表的更多相关文章

  1. mysql之repair table 修复表札记

    REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE   tbl_name[,tbl_name] ... [QUICK] [EXTENDED] [USE_FRM] REP ...

  2. Magento table rates表运费设置

    在magento中集成了Table rate表运费,这种运输方式.表运费就是我们自己写个运费表,根据距离和商品重量设置运费,制做成一张csv格式的表,导入到magento中,来实现运费的控制. 在我的 ...

  3. 14.10.4 Defragmenting a Table 整理表

    14.10.4 Defragmenting a Table 整理表: 随机插入或者删除从一个secondary index 可以导致index变的fragmented Fragmentation意味着 ...

  4. -1-4 java io java流 常用流 分类 File类 文件 字节流 字符流 缓冲流 内存操作流 合并序列流

      File类 •文件和目录路径名的抽象表示形式 构造方法 •public File(String pathname) •public File(String parent,Stringchild) ...

  5. 【原创】访问Linux进程文件表导致系统异常复位的排查记录

    前提知识: Linux内核.Linux 进程和文件数据结构.vmcore解析.汇编语言 问题背景: 这个问题出自项目的一个安全模块,主要功能是确定某进程是否有权限访问其正在访问的文件. 实现功能时,需 ...

  6. Oracle学习——dmp文件(表)导入与导出

    Oracle学习——dmp文件(表)导入与导出 2014-12-28      0个评论    来源:张文康 廊坊师范学院信息技术提高班 第九期   收藏    我要投稿 前言 关于dmp文件我们用的 ...

  7. Java使用HTTP编程模拟多参数多文件表单信息的请求与处理

    本文目的是提供Java环境下模拟浏览器页面提交多参数多文件表单请求以及解析请求的Demo代码.这里用Java提供的HttpURLConnection类做HTTP请求,再原始点可以直接使用socket. ...

  8. SpringMVC 完美解决PUT请求参数绑定问题(普通表单和文件表单)

    一 解决方案 修改web.xml配置文件 将下面配置拷贝进去(在原有的web-app节点里面配置 其它配置不变) <!-- 处理PUT提交参数(只对基础表单生效) --> <filt ...

  9. linux 文件描述符表 打开文件表 inode vnode

      在Linux中,进程是通过文件描述符(file descriptors,简称fd)而不是文件名来访问文件的,文件描述符实际上是一个整数.Linux中规定每个进程能最多能同时使用NR_OPEN个文件 ...

随机推荐

  1. stringstream istringstream ostringstream 三者的区别

    stringstream istringstream ostringstream 三者的区别 说明 ostringstream : 用于执行C风格字符串的输出操作. istringstream : 用 ...

  2. [LeetCode] 210. 课程表 II

    题目链接:https://leetcode-cn.com/problems/course-schedule-ii/ 题目描述: 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前 ...

  3. PY个快速模

    既然这道题是数学题,那就用 PY 吧! 学点东西: print 可以和 c++ 中的 printf 一样快乐的输出格式 另外一点: 这道题可能数据不够强?想想应该有一个 \(0^0 ~\%~ k =0 ...

  4. Text Autosizer&&解决移动端网页文本字体怪异增大问题

    在做移动端页面时,有时你设置了字体大小,有的部分即使设置了行内样式也不生效,而有些显示正常,这个特性就是Text Autosizer在搞鬼. 以下是解决方案: ①给元素设置 -webkit-text- ...

  5. 使用PHPWord生成word文档

    有时我们需要把网页内容保存为Word文档格式,以供其他人员查看和编辑.PHPWord是一个用纯PHP编写的库,使用PHPWord可以轻松处理word文档内容,生成你想要的word文档. 下载源码 安装 ...

  6. java流stream中的collect()方法详解

    public class StreamTest { /** * stream.collect() 的本质由三个参数构成, * 1. Supplier 生产者, 返回最终结果 * 2. BiConsum ...

  7. 线性渐变css

    从上到下的线性渐变: #grad { background: -webkit-linear-gradient(red, blue); /* Safari 5.1 - 6.0 */ background ...

  8. nginx之热部署,以及版本回滚

    热部署的概念:当从老版本替换为新版本的nginx的时候,如果不热部署的话,会需要取消nginx服务并重启服务才能替换成功,这样的话会使正在访问的用户在断开连接,所以为了不影响用户的体验,且需要版本升级 ...

  9. 使用pycharm编写自动化脚本

    1.:导入本地Python环境 2:安装Selenium 3:下来需要根据安装的浏览器版本,下载合适的chromedriver驱动程序. 4:接着需要将下载的chromedriver进行解压,并将文件 ...

  10. jemter简单测试方式

    一.简介 Jmeter是一款优秀的开源测试工具, 是每个资深测试工程师,必须掌握的测试工具,熟练使用Jmeter能大大提高工作效率. **开源,他是一款开源的免费软件,使用它你不需要支付任何费用, * ...