加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SqlServer 2012 FileTable 文件表

发布时间:2020-12-12 13:04:15 所属栏目:MsSql教程 来源:网络整理
导读:SQL Server 2012 提供一种特殊的“文件表”,也称为“FileTable”。 FileTable 是一种专用的用户表,它包含存储 FILESTREAM 数据的预定义架构以及文件和目录层次结构信息、文件属性。FileTable 功能为 SQL Server 中存储的文件数据提供对 Windows 文件命名空

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 N'filestream access level',2
reconfigure with override



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


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

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

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

--	或者在当前数据库中添加 FILESTREAM 文件组
ALTER DATABASE [AdventureWorks2012]
ADD FILEGROUP FileStreamGroup CONTAINS FILESTREAM;


ALTER DATABASE [AdventureWorks2012]
ADD FILE
(
	 NAME = FileStreamFile,MAXSIZE = 50 MB
)
TO FILEGROUP FileStreamGroup
GO


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



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

--	在数据库级别上指定 非事务性访问级别 和 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)?)

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 架构)

--	查看 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(N'DocumentStore');
SELECT FileTableRootPath(N'dbo.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-pcmssqlserverFileStreamPathFileStreamPath
--	此时文件表 [DocumentStore] 仍可正常操作


ALTER DATABASE [AdventureWorks2012]
    SET FILESTREAM ( NON_TRANSACTED_ACCESS = READ_ONLY );
GO
--	只读状态,路径可拷贝文件出来,但无法拷贝文件到该目录
--	Kk-pcmssqlserverFileStreamPathFileStreamPath
--	此时文件表 [DocumentStore] 仍可正常操作

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

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


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

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

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

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

更多参考:FileTable (SQL Server)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读