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:\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
|
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:\database\FileStreamFile'
,
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-pc\mssqlserver\FileStreamPath\FileStreamPath
-- 此时文件表 [DocumentStore] 仍可正常操作
ALTER
DATABASE
[AdventureWorks2012]
SET
FILESTREAM ( NON_TRANSACTED_ACCESS = READ_ONLY );
GO
-- 只读状态,路径可拷贝文件出来,但无法拷贝文件到该目录
-- \\Kk-pc\mssqlserver\FileStreamPath\FileStreamPath
-- 此时文件表 [DocumentStore] 仍可正常操作
|
重新启用完全非事务性访问权限:
1
2
3
4
|
-- 重新启用完全非事务性访问权限
ALTER
DATABASE
[AdventureWorks2012]
SET
FILESTREAM ( NON_TRANSACTED_ACCESS =
FULL
);
GO
|
禁用 FileTable 命名空间将会禁用所有系统定义的约束并触发使用 FileTable 创建的约束。
1
2
3
4
|
-- 禁用 FileTable 命名空间
-- (禁用后路径 \\Kk-pc\mssqlserver\FileStreamPath\FileStreamPath 不可访问)
ALTER
TABLE
[DocumentStore] DISABLE FILETABLE_NAMESPACE;
GO
|
1
2
3
|
-- 重新启用 FileTable 命名空间
ALTER
TABLE
[DocumentStore] ENABLE FILETABLE_NAMESPACE;
GO
|
更多注意的事情还需要到参考官方文档:FileTable 与其他 SQL Server 功能的兼容性