zoukankan      html  css  js  c++  java
  • [SQLServer大对象]——FileTable初体验 (转载)

    阅读导航
    启用FILESTREAM设置
    更改FILESTRAM设置
    启用数据库非事务性访问级别
    FileTable

    在我接触FileTable之前,存储文件都是存储文件的链接和扩展名到数据,其实并没有实际的把文件存储到数据库。
    FileTable不同于一般的表,他可以存储非结构数据和元数据(如:文件、文档),存储的文件可以像普通的文件一样通过一个路径被访问,而且不必对客户端程序修改。
    FileTable 不支持内存映射文件。 “记事本”和“画图”是两个常见的使用内存映射文件的示例应用程序。 不能在 SQL Server 所在的计算机上使用这些应用程序来打开存储在 FileTable 中的文件。 但是,可以从远程计算机使用这些应用程序来打开存储在 FileTable 中的文件,因为在这些情况下不使用内存映射功能

    启用FILESTREAM设置
    1.  开始菜单 –> 所有程序 –> Microsoft SQL Server Code-Named 2012 –> 配置工具 –>选择SQL配置管理器
    当然这么一个接着一个的用鼠标点,有点不像搞IT的同学,那么专业一点,使用命令 SQLServerManager10.msc,如果是SQL2005使用 SQLServerManager.msc 打开。
    2. 在服务列表中,单击 SQL Server服务器
    3. 在 SQL Server配置管理器中,找到 FILESTREAM 的 SQL Server 实例,右键该实例 –> 点击属性
    4. SQL Server属性对话框 –> FILESTREAM 选项卡
    5. 勾选 Transact-SQL访问启用FILESTREAM 复选框
    6. 如果要在Windows中读取和写入 FILESTREAM 数据勾选针对文件I/O流访问启用 FILESTRAM,在Windows共享名框中输入 Windows 共享名称
        这里配置后,FileTable创建好后,就可以想操作本地文件一样在FileTable中操作文件

    7. 如果希望远程访问存储在该共享中的 FILESTREAM 数据,勾选允许远程客户端针对 FILESTREAM 数据流访问
    8. 应用

    更改FILESTRAM设置
    在SQL Server Managerment studio中,使用Transact-SQL修改配置

    EXEC sp_configure filestream_access_level, 2
    RECONFIGURE 

    执行之后,需要重新启动 SQL Server 服务
     
    创建启动 FILESTRAM 的数据库
    在SQL Server Managerment studio中,使用Transact-SQL创建数据库

    CREATE DATABASE  Archive
    ON
    PRIMARY ( NAME = ArchiveMDF,
        FILENAME = 'C:MyDataarchdat.mdf'),      -- C:MyData路径必须存在
    FILEGROUP FileStreamGroupFirst CONTAINS FILESTREAM( NAME = ArchiveFILESTREAM,
        FILENAME = 'C:MyDataMyFileStream')      -- C:MyData路径下MyFileStream文件夹必须不存在
    LOG ON  ( NAME = ArchiveLDF,
        FILENAME = 'C:MyDataarchlog.ldf')
    GO

    运行该脚本后
    C:MyDataMyFileStream 文件夹中会出现filestream.hdr 文件和 $FSLOG 文件夹。filestream.hdr 文件是重要的系统文件,它包含 FILESTREAM 头信息。

    启用数据库非事务性访问级别
    为了允许对 SQL Server 中存储文件进行非事务性访问,须在FileTable的数据上设置数据库非事务性访问级别。
    修改数据库非事务性访问级别

    ALTER DATABASE Archive
    SET FILESTREAM ( NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'MyDirectory' )    -- 指定数据库访问级别和指定目录名字

    创建数据库时设置非事务性访问级别

    CREATE DATABASE Archive
    WITH FILESTREAM ( NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'MyDirectory' )-- 指定数据库访问级别和指定目录名字

    查看数据库访问级别

    SELECT DB_NAME(database_id), non_transacted_access, non_transacted_access_desc
    FROM sys.database_filestream_options;
    GO

    为什么要设置非事务性访问级别

    存储在 FileTable 中的文件和目录数据通过用于非事务性文件访问的 Windows 共享区(针对基于 Windows API 的应用程序)公开。 对于 Windows 应用程序,这看起来像一个包含文件和目录的普通共享区。 应用程序可使用一组广泛的 Windows API,用于对此共享区下的文件和目录进行管理。意思就是说如果你想用C#等高级语言的API,来访问FileTable 中的文件和目录就必须启用数据库非事务性访问级别。

    FileTable

    FileTable 是用户表,具有预定义的结构,为了存储 FILESTREAM 数据、文件和目录信息以及文件属性。因此,创建 FileTable 时不需要指定列,但也可以指定,在此我只用最简单的方式创建和使用FileTable。

    不指定用户定义值

    CREATE TABLE DocumentStores AS FileTable;
    GO 

    指定用户定义值

    CREATE TABLE DocumentStores AS FileTable
    WITH
    (
        FileTable_Directory = 'DocumentStores',
        FileTable_Collate_Filename = database_default
    );
    GO 

    在没有指定用户定义值时,FILETABLE_DIRECTORY 的值将为 FileTable 的名称,FILETABLE_COLLATE_FILENAME 的值仍为database_default。
    此时,就可以在数据库Archive的数据库 –> Tables –> FileTables,可以看到之前创建的FileTable表DocumentStores
    在FileTable上右键 –> 浏览,可以直接复制文件到这个目录,图中我新建一个文本文档。

    也可以使用语句进行查询

    当然FileTable表中不仅可以包含文件,还可以包含目录(文件夹),如下图所示,我们在FileTable表DocumentStores中,新建了一个文件:文件1.txt,和两个目录:DemoFolder1DemoFolder2

    其中在目录DemoFolder2中,我们还创建了另一个文件:文件2.txt

    这时我们查询表DocumentStores会得到四条记录,分别对应两个文件和两个目录,其中可以通过列parent_path_locator和path_locator的值,知道文件2.txt在目录DemoFolder2

    如果我们用SQL语句删除文件文件1.txt

    可以看到共享目录下文件1.txt也相应地被删除了

    但是这里并不建议使用SQL语句来删除FileTable表中的文件和目录,因为这可能会违反FileTable表的约束。最好通过文件系统或Windows API,来对FileTable表中的文件和目录进行操作。

    FileTable注意
    不能将现有表转换为FileTable。
    必须完成上面的步骤启用FILESTREAM设置更改FILESTRAM设置
    由于FileTable 包含一个 FILESTREAM 列,因此FileTable 需要有效的 FILESTREAM 文件组。
    不能在tempdb或任何其他系统数据库中创建FileTable。
    不能将FileTable作为临时表。
    不能更改 FILETABLE_COLLATE_FILENAME 的值。
    不能更改、删除或禁用 FileTable 系统定义的列。
    不能将新的用户列、计算列或持久化计算列添加到 FileTable。
    删除FileTable时,将删除 FileTable 的所有列以及与该表关联的所有对象,如索引、约束和触发器。
    删除FileTable时,FileTable 目录及其子目录将从数据库的 FILESTREAM 文件和目录层次结构中消失。

    益处

    此外个人觉得使用FileTable的最大好处是,在备份数据库的时候, FileTable表中的所有文件和目录会一并放入.bak数据库备份文件,然后在还原数据库的时候,也会一起被还原出来。

    MSDN上关于FileTable的介绍

    原文链接

  • 相关阅读:
    js 遇到问题
    table 排序 添加 删除 等操作
    json对象
    .style, .getComputedStyle(),.currentStyle区别
    3个div 宽度移入移出时变化
    运动 js
    OWASP Top 10之文件上传漏洞简析(二)
    owasp top10 之文件上传漏洞简析
    前台实现ajax 需注意的地方
    apache-Rewrite重写规则配置
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/10066703.html
Copyright © 2011-2022 走看看