• SQL Server 2012的新特性之-FileTable
  • Merry 发表于 2016/2/17 13:22:00 | 分类标签: FileTable SQLServer
  •  FileTable是SQL Server 2012的新特性之一。它是基于SQL Server 2008的FILESTREAM特性上而来的,允许我们把Windows文件存储在SQL Server中,让SQL Server可以存储非结构化的数据。也就是存是存在SQL Server中,像backup这种SQL Server这种操作也可以兼顾到,但是对于文件的访问时是通过Windows文件系统来访问的。FileTable和Windows文件的命名空间达到兼容,还可以和SQL Server的全文索引(fulltext)和语义搜索(semantic search)结合。以往我们都是通过文件服务器来管理文件,由于SQL Server提供了对文件管理的支持和整合,所以FileTable成了和应用程序相结合起来管理文件的一个好的办法,而且它又具备了一些SQL Server的特性,比如backup的支持,而应用程序可以如常的从文件系统的角度去访问文件。

    和Windows达到兼容性

    既然和Windows达到兼容性,那么FileTable(或者它自身具备的FileStream的特性)就应该是和具备Windows API的一些特性,如:

    1)非事务型流数据访问和就地(原)文件更新;

    2)层级命名空间(文件目录结构和文件);

    3)文件属性,如文件创建日期和修改日期;

    4)对Windows文件和目录的管理;

    FileTable的结构

    FileTable的结构是固定是。表中的每一行数据代表了一个文件,表中的栏位代表了文件的一些属性列,像文件创建时间和修改时间,以及文件的路径。参考FileTable Schema

    我们都知道FILESTREAM是基于Windows文件系统的共享功能,那么FileTable也不例外。我们通过在FILESTREAM共享路径下创建根路径给一张FileTable。FileTable和T-SQL也是结合的,允许被更新和查询数据。

    Windows文件系统和SQL Server间的整合

    对FILETABLE根目录的任何改动,比如对文件的创建更新删除都会反映到FILETABLE表中。

    事务性和非事务性

    FileTable作为一张SQL Server表,表的数据更新是支持事务性的。但是由于对文件的操作是属于一个Windows文件系统的操作行为,是不具备事务性的。而FILESTREAM其实是支持事务性的。

    FileTable和FileStream的关系

    FileTable依赖于FileStream特性。FileTable本身是需要启用non-transactional access选项,但是不代表说FileStream本身是必须开启这个选项的。也就是如果我不使用FileTable,我再添加FILESTREAM FILEGROUP的时候是不需要启用non-transactional access选项。其次,FileStream可能包含FileTable的数据和其他应用程序的数据,然后FileTable的non-transactional access选项并不对其他的数据造成影响。

     使用FileTable前先开启FileStream功能,这个功能要么你在安装的时候就勾选启用选项,要么你就开启server-level configuration。需要说明由于filestream功能使用了139和445端口,所以防火墙要允许139(inbound)和445(inbound)端口。

    EXEC sp_configure filestream_access_level, 2
    RECONFIGURE

    再开启数据库的filestream功能

    ALTER DATABASE JerryDB
    SET FILESTREAM
    ( 
    NON_TRANSACTED_ACCESS = FULL,
    DIRECTORY_NAME = N'FileTable1'
    );

     加入一个FILESTREAM FILEGROUP到当前数据库

    ALTER DATABASE JerryDB
    ADD FILEGROUP FILESTREAM_FG
    CONTAINS FILESTREAM;

    为当前的文件组添加一个共享路径

    ALTER DATABASE JerryDB
    ADD FILE
    (
    NAME= 'FILESTREAM_File1',
    FILENAME = 'F:\Database Log Files\FILESTREAM_File1'
    )
    TO FILEGROUP FILESTREAM_FG;

    数据库的配置完成后就可以创建filetable了。除了下面两个选项,还可以指定表的主键约束等三个约束的名字

    CREATE TABLE DemoFileTable AS FILETABLE
    WITH
    ( 
    FILETABLE_DIRECTORY = 'FileTable1',
    FILETABLE_COLLATE_FILENAME = database_default
    );
    GO

    创建完表之后你可以通过Windows Explorer在FileStream共享路径下新建、删除、修改文件,共享路径为

    \\SERVERNAME\FILESTREAM_WINDOWS_SHARE_NAME\FILESTREAM_TABLE_NAME\FILETABLE_DIRECTORY\

    结果也会反映到FileTable中。你甚至可以更新文件的名字、创建日期、修改日期等。这些改动同样会反映到文件本身的NTFS文件系统属性。

    获取文件完整路径

    SELECT FileTableRootPath()+[file_stream].GetFileNamespacePath(),
    GetPathLocator(FileTableRootPath()+[file_stream].GetFileNamespacePath()),
    path_locator
    FROM [JerryDB].[dbo].[DemoFileTable]

     

  • 请您注意

    ·自觉遵守:爱国、守法、自律、真实、文明的原则

    ·尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规

    ·严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的作品

    ·承担一切因您的行为而直接或间接导致的民事或刑事法律责任

    ·您在编程中国社区新闻评论发表的作品,本网站有权在网站内保留、转载、引用或者删除

    ·参与本评论即表明您已经阅读并接受上述条款

  • 感谢本文作者
  • 作者头像
  • 昵称:Merry
  • 加入时间:2013/5/7 0:00:00
  • TA的签名
  • 这家伙很懒,虾米都没写
  • +进入TA的空间
  • 以下内容也很赞哦
分享按钮