首页 > 代码库 > SQL Server 2012 FileTable 文件表

SQL Server 2012 FileTable 文件表

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 服务器配置选项)

exec sp_configure Nfilestream access level ,2reconfigure with override

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

 

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

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

--    创建数据库时创建 FILESTREAM 文件组CREATE DATABASE FileStreamDB ONPRIMARY (     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 = NFileStreamPath )GO
--    或者在当前数据库中添加 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 FileStreamGroupGO

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

技术分享

 

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

--    在数据库级别上指定 非事务性访问级别 和 FileTable目录(数据库须独占)ALTER DATABASE [AdventureWorks2012]SET FILESTREAM ( NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = NFileStreamPath )--    启用后即可查看到其状态信息SELECT DB_NAME(database_id) [database],non_transacted_access, non_transacted_access_descFROM sys.database_filestream_optionsWHERE non_transacted_access_desc <> OFFSELECT DB_NAME(database_id) [database],directory_name FROM sys.database_filestream_options WHERE directory_name IS NOT NULL

技术分享

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

USE [AdventureWorks2012]GOCREATE TABLE [DocumentStore] AS FileTableWITH (     --文件目录,不区分大小写,不指定则为filetable名称[DocumentStore]    FileTable_Directory = NFileStreamPath,    FileTable_Collate_Filename = database_default    --排序规则);GO--    更改目录ALTER TABLE [DocumentStore]    SET ( FILETABLE_DIRECTORY = NFileStreamPath );GO

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

 

技术分享

 

相关查询:(FileTable 架构)

--    查看 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 ObjectFROM sys.filetable_system_defined_objectsORDER BY FileTable, System-defined Object;

技术分享

至此,已经配置完成!~

 

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

--    查看 FileTableSELECT * FROM [dbo].[DocumentStore]--    获取特定 FileTable 或当前数据库的根级 UNC 路径。SELECT FileTableRootPath();SELECT FileTableRootPath(NDocumentStore);SELECT FileTableRootPath(Ndbo.DocumentStore);

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

技术分享

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

--    查看 FileTableSELECT * FROM [dbo].[DocumentStore]

技术分享

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

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

--    删除表 FileTable 中的记录,文件也会被删除DELETE FROM [dbo].[DocumentStore] WHERE stream_id = BA483ECA-AE0E-E511-8367-005056C00008SELECT * FROM [dbo].[DocumentStore]

技术分享

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

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

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] 仍可正常操作

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

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

 

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

--    禁用 FileTable 命名空间--    (禁用后路径 \\Kk-pc\mssqlserver\FileStreamPath\FileStreamPath 不可访问)ALTER TABLE [DocumentStore] DISABLE FILETABLE_NAMESPACE;GO

 

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

 

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

更多参考:FileTable (SQL Server)

 

SQL Server 2012 FileTable 文件表