zoukankan      html  css  js  c++  java
  • SqlServer2012 File Table文件表

    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:databaseFileStreamDB.mdf',
        SIZE = 5MB,
        MAXSIZE = 25MB,
        FILEGROWTH = 5MB
    ),
    FILEGROUP FileStreamGroup CONTAINS FILESTREAM(
         NAME = FileStreamFile,
         FILENAME = 'G:databaseFileStreamFile',
         MAXSIZE = 50 MB
    )
    LOG ON (
        NAME = FileStreamDB_log,
        FILENAME = 'G:databaseFileStreamDB_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:databaseFileStreamFile',
         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-pcmssqlserverFileStreamPathFileStreamPath
    --  此时文件表 [DocumentStore] 仍可正常操作
     
     
    ALTER DATABASE [AdventureWorks2012]
        SET FILESTREAM ( NON_TRANSACTED_ACCESS = READ_ONLY );
    GO
    --  只读状态,路径可拷贝文件出来,但无法拷贝文件到该目录
    --  \Kk-pcmssqlserverFileStreamPathFileStreamPath
    --  此时文件表 [DocumentStore] 仍可正常操作

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


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

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

    1
    2
    3
    --  重新启用 FileTable 命名空间
    ALTER TABLE [DocumentStore] ENABLE FILETABLE_NAMESPACE;
    GO

    更多注意的事情还需要到参考官方文档:FileTable 与其他 SQL Server 功能的兼容性
  • 相关阅读:
    Nuxt.js 踩坑记录(2) 使用sequelize时,提示install mysql2,安装了仍然不能解决问题
    Nuxt.js 踩坑记录,(1)引入fs包报错
    JS手写call、bind、apply
    手写Promise简易版
    generator函数
    ["1","2","3"].map(parseInt)结果
    改变对象转换为原始值的方式
    instanceof判断问题
    e.target和e.currentTarget区别
    java设计模式--适配器模式
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/7754506.html
Copyright © 2011-2022 走看看