閱讀導航
啓用FILESTREAM設置
更改FILESTRAM設置
啓用數據庫非事務性訪問級別
FileTablehtml
在我接觸FileTable以前,存儲文件都是存儲文件的連接和擴展名到數據,其實並無實際的把文件存儲到數據庫。
FileTable不一樣於通常的表,他能夠存儲非結構數據和元數據(如:文件、文檔),存儲的文件能夠像普通的文件同樣經過一個路徑被訪問,並且沒必要對客戶端程序修改。
FileTable 不支持內存映射文件。 「記事本」和「畫圖」是兩個常見的使用內存映射文件的示例應用程序。 不能在 SQL Server 所在的計算機上使用這些應用程序來打開存儲在 FileTable 中的文件。 可是,能夠從遠程計算機使用這些應用程序來打開存儲在 FileTable 中的文件,由於在這些狀況下不使用內存映射功能sql
啓用FILESTREAM設置
1. 開始菜單 –> 全部程序 –> Microsoft SQL Server Code-Named 2012 –> 配置工具 –>選擇SQL配置管理器。
固然這麼一個接着一個的用鼠標點,有點不像搞IT的同窗,那麼專業一點,使用命令 SQLServerManager10.msc,若是是SQL2005使用 SQLServerManager.msc 打開。
2. 在服務列表中,單擊 SQL Server服務器
3. 在 SQL Server配置管理器中,找到 FILESTREAM 的 SQL Server 實例,右鍵該實例 –> 點擊屬性
4. SQL Server屬性對話框 –> FILESTREAM 選項卡
5. 勾選 Transact-SQL訪問啓用FILESTREAM 複選框
6. 若是要在Windows中讀取和寫入 FILESTREAM 數據勾選針對文件I/O流訪問啓用 FILESTRAM,在Windows共享名框中輸入 Windows 共享名稱。
這裏配置後,FileTable建立好後,就能夠想操做本地文件同樣在FileTable中操做文件。數據庫
7. 若是但願遠程訪問存儲在該共享中的 FILESTREAM 數據,勾選容許遠程客戶端針對 FILESTREAM 數據流訪問
8. 應用服務器
更改FILESTRAM設置
在SQL Server Managerment studio中,使用Transact-SQL修改配置工具
EXEC sp_configure filestream_access_level, 2 RECONFIGURE
執行以後,須要從新啓動 SQL Server 服務
建立啓動 FILESTRAM 的數據庫
在SQL Server Managerment studio中,使用Transact-SQL建立數據庫spa
CREATE DATABASE Archive ON PRIMARY ( NAME = ArchiveMDF, FILENAME = 'C:\MyData\archdat.mdf'), -- C:\MyData路徑必須存在 FILEGROUP FileStreamGroupFirst CONTAINS FILESTREAM( NAME = ArchiveFILESTREAM, FILENAME = 'C:\MyData\MyFileStream') -- C:\MyData路徑下MyFileStream文件夾必須不存在 LOG ON ( NAME = ArchiveLDF, FILENAME = 'C:\MyData\archlog.ldf') GO
運行該腳本後
C:\MyData\MyFileStream 文件夾中會出現filestream.hdr 文件和 $FSLOG 文件夾。filestream.hdr 文件是重要的系統文件,它包含 FILESTREAM 頭信息。code
啓用數據庫非事務性訪問級別
爲了容許對 SQL Server 中存儲文件進行非事務性訪問,須在FileTable的數據上設置數據庫非事務性訪問級別。
修改數據庫非事務性訪問級別server
ALTER DATABASE Archive SET FILESTREAM ( NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'MyDirectory' ) -- 指定數據庫訪問級別和指定目錄名字
建立數據庫時設置非事務性訪問級別htm
CREATE DATABASE Archive WITH FILESTREAM ( NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'MyDirectory' )-- 指定數據庫訪問級別和指定目錄名字
查看數據庫訪問級別對象
SELECT DB_NAME(database_id), non_transacted_access, non_transacted_access_desc FROM sys.database_filestream_options; GO
爲何要設置非事務性訪問級別
存儲在 FileTable 中的文件和目錄數據經過用於非事務性文件訪問的 Windows 共享區(針對基於 Windows API 的應用程序)公開。 對於 Windows 應用程序,這看起來像一個包含文件和目錄的普通共享區。 應用程序可以使用一組普遍的 Windows API,用於對此共享區下的文件和目錄進行管理。意思就是說若是你想用C#等高級語言的API,來訪問FileTable 中的文件和目錄就必須啓用數據庫非事務性訪問級別。
FileTable 是用戶表,具備預約義的結構,爲了存儲 FILESTREAM 數據、文件和目錄信息以及文件屬性。所以,建立 FileTable 時不須要指定列,但也能夠指定,在此我只用最簡單的方式建立和使用FileTable。
不指定用戶定義值
CREATE TABLE DocumentStores AS FileTable; GO
指定用戶定義值
CREATE TABLE DocumentStores AS FileTable WITH ( FileTable_Directory = 'DocumentStores', FileTable_Collate_Filename = database_default ); GO
在沒有指定用戶定義值時,FILETABLE_DIRECTORY 的值將爲 FileTable 的名稱,FILETABLE_COLLATE_FILENAME 的值仍爲database_default。
此時,就能夠在數據庫Archive的數據庫 –> Tables –> FileTables,能夠看到以前建立的FileTable表DocumentStores
在FileTable上右鍵 –> 瀏覽,能夠直接複製文件到這個目錄,圖中我新建一個文本文檔。
也可使用語句進行查詢
固然FileTable表中不只能夠包含文件,還能夠包含目錄(文件夾),以下圖所示,咱們在FileTable表DocumentStores中,新建了一個文件:文件1.txt,和兩個目錄:DemoFolder1、DemoFolder2
其中在目錄DemoFolder2中,咱們還建立了另外一個文件:文件2.txt
這時咱們查詢表DocumentStores會獲得四條記錄,分別對應兩個文件和兩個目錄,其中能夠經過列parent_path_locator和path_locator的值,知道文件2.txt在目錄DemoFolder2中
若是咱們用SQL語句刪除文件文件1.txt後
能夠看到共享目錄下文件1.txt也相應地被刪除了
可是這裏並不建議使用SQL語句來刪除FileTable表中的文件和目錄,由於這可能會違反FileTable表的約束。最好經過文件系統或Windows API,來對FileTable表中的文件和目錄進行操做。
FileTable注意
不能將現有錶轉換爲FileTable。
必須完成上面的步驟啓用FILESTREAM設置和更改FILESTRAM設置。
因爲FileTable 包含一個 FILESTREAM 列,所以FileTable 須要有效的 FILESTREAM 文件組。
不能在tempdb或任何其餘系統數據庫中建立FileTable。
不能將FileTable做爲臨時表。
不能更改 FILETABLE_COLLATE_FILENAME 的值。
不能更改、刪除或禁用 FileTable 系統定義的列。
不能將新的用戶列、計算列或持久化計算列添加到 FileTable。
刪除FileTable時,將刪除 FileTable 的全部列以及與該表關聯的全部對象,如索引、約束和觸發器。
刪除FileTable時,FileTable 目錄及其子目錄將從數據庫的 FILESTREAM 文件和目錄層次結構中消失。
益處
此外我的以爲使用FileTable的最大好處是,在備份數據庫的時候, FileTable表中的全部文件和目錄會一併放入.bak數據庫備份文件,而後在還原數據庫的時候,也會一塊兒被還原出來。