SqlServer2012 File Table文件表(一)

2015-07-24 08:59:06 · 作者: · 浏览: 3

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:\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 = N'FileStreamPath' )
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 = 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].[Do