SqlServer 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 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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |