当前位置:Gxlcms > 数据库问题 > SQL Server 2012 FileTable 文件表

SQL Server 2012 FileTable 文件表

时间:2021-07-01 10:21:17 帮助过:10人阅读

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 文件表

标签:记录   sqlserver   blank   也会   access   isa   创建   官方   应用程序   

人气教程排行