SQL Server 2012 FileTable 文件表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ,2
reconfigure with override

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

 

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

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

--    创建数据库时创建 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 = 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 FileStreamGroup
GO

创建文件时 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_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) 

USE [AdventureWorks2012]
GO
CREATE TABLE [DocumentStore] 
AS FileTable
WITH ( 
    --文件目录,不区分大小写,不指定则为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 Object
FROM sys.filetable_system_defined_objects
ORDER BY FileTable, System-defined Object;

技术分享

至此,已经配置完成!~

 

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

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

--    获取特定 FileTable 或当前数据库的根级 UNC 路径。
SELECT FileTableRootPath();
SELECT FileTableRootPath(NDocumentStore);
SELECT FileTableRootPath(Ndbo.DocumentStore);

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

技术分享

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

--    查看 FileTable
SELECT * 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-005056C00008

SELECT * 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 文件表的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server FileTable:删除文件

SQL Server FileTable 移动目录与内容 T-SQL

如何使用Sqlserver 2012 Always on技术

如何从 SQL Server 文件表中的二进制数据中获取文件类型?

另一个表中的 FileTable 和外键

ASP.Net Core 2.0 FileTable 使用