FileTable是SQL Server 2012的新特性之一。它是基於SQL Server 2008的FILESTREAM特性上而來的,允許我們把Windows文件存儲在SQL Server中,讓SQL Server可以存儲非結構化的數據。也就是存是存在SQL Server中,像backup這種SQL Server這種操作也可以兼顧到,但是對於文件的訪問時是通過Windows文件系統來訪問的。FileTable和Windows文件的命名空間達到兼容,還可以和SQL Server的全文索引(fulltext)和語義搜索(semantic search)結合。以往我們都是通過文件服務器來管理文件,由於SQL Server提供了對文件管理的支持和整合,所以FileTable成了和應用程序相結合起來管理文件的一個好的辦法,而且它又具備了一些SQL Server的特性,比如backup的支持,而應用程序可以如常的從文件系統的角度去訪問文件。
和Windows達到兼容性
既然和Windows達到兼容性,那麼FileTable(或者它自身具備的FileStream的特性)就應該是和具備Windows API的一些特性,如:
1)非事務型流數據訪問和就地(原)文件更新;
2)層級命名空間(文件目錄結構和文件);
3)文件屬性,如文件創建日期和修改日期;
4)對Windows文件和目錄的管理;
FileTable的結構
FileTable的結構是固定是。表中的每一行數據代表了一個文件,表中的欄位代表了文件的一些屬性列,像文件創建時間和修改時間,以及文件的路徑。參考FileTableSchema
我們都知道FILESTREAM是基於Windows文件系統的共享功能,那麼FileTable也不例外。我們通過在FILESTREAM共享路徑下創建根路徑給一張FileTable。FileTable和T-SQL也是結合的,允許被更新和查詢數據。
Windows文件系統和SQL Server間的整合
對FILETABLE根目錄的任何改動,比如對文件的創建更新刪除都會反映到FILETABLE表中。
事務性和非事務性
FileTable作為一張SQL Server表,表的數據更新是支持事務性的。但是由於對文件的操作是屬於一個Windows文件系統的操作行為,是不具備事務性的。而FILESTREAM其實是支持事務性的。
FileTable和FileStream的關系
FileTable依賴於FileStream特性。FileTable本身是需要啟用non-transactional access選項,但是不代表說FileStream本身是必須開啟這個選項的。也就是如果我不使用FileTable,我再添加FILESTREAM FILEGROUP的時候是不需要啟用non-transactional access選項。其次,FileStream可能包含FileTable的數據和其他應用程序的數據,然後FileTable的non-transactional access選項並不對其他的數據造成影響。
使用FileTable前先開啟FileStream功能,這個功能要麼你在安裝的時候就勾選啟用選項,要麼你就開啟server-level configuration。需要說明由於filestream功能使用了139和445端口,所以防火牆要允許139(inbound)和445(inbound)端口。
EXEC sp_configure filestream_access_level, 2 RECONFIGURE
再開啟數據庫的filestream功能
ALTER DATABASE JerryDB SET FILESTREAM ( NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'FileTable1' );
加入一個FILESTREAM FILEGROUP到當前數據庫
ALTER DATABASE JerryDB ADD FILEGROUP FILESTREAM_FG CONTAINS FILESTREAM;
為當前的文件組添加一個共享路徑
ALTER DATABASE JerryDB ADD FILE ( NAME= 'FILESTREAM_File1', FILENAME = 'F:\Database Log Files\FILESTREAM_File1' ) TO FILEGROUP FILESTREAM_FG;
數據庫的配置完成後就可以創建filetable了。除了下面兩個選項,還可以指定表的主鍵約束等三個約束的名字
CREATE TABLE DemoFileTable AS FILETABLE WITH ( FILETABLE_DIRECTORY = 'FileTable1', FILETABLE_COLLATE_FILENAME = database_default ); GO
創建完表之後你可以通過Windows Explorer在FileStream共享路徑下新建、刪除、修改文件,共享路徑為
\\SERVERNAME\FILESTREAM_WINDOWS_SHARE_NAME\FILESTREAM_TABLE_NAME\FILETABLE_DIRECTORY\
結果也會反映到FileTable中。你甚至可以更新文件的名字、創建日期、修改日期等。這些改動同樣會反映到文件本身的NTFS文件系統屬性。
獲取文件完整路徑
SELECT FileTableRootPath()+[file_stream].GetFileNamespacePath(), GetPathLocator(FileTableRootPath()+[file_stream].GetFileNamespacePath()), path_locator FROM [JerryDB].[dbo].[DemoFileTable]
參考:
FileTableSchema
FileTables(SQLServer)
FullTextSearchesonDocumentsinFileTables
FileTableFeatureinSQLServer2012