閱讀導航
在我接觸FileTable之前,存儲文件都是存儲文件的鏈接和擴展名到數據,其實並沒有實際的把文件存儲到數據庫。
FileTable不同於一般的表,他可以存儲非結構數據和元數據(如:文件、文檔),存儲的文件可以像普通的文件一樣通過一個路徑被訪問,而且不必對客戶端程序修改。
FileTable 不支持內存映射文件。 “記事本”和“畫圖”是兩個常見的使用內存映射文件的示例應用程序。 不能在 SQL Server 所在的計算機上使用這些應用程序來打開存儲在 FileTable 中的文件。 但是,可以從遠程計算機使用這些應用程序來打開存儲在 FileTable 中的文件,因為在這些情況下不使用內存映射功能
啟用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修改配置
1: EXEC sp_configure filestream_access_level, 2
2: RECONFIGURE
執行之后,需要重新啟動 SQL Server 服務
創建啟動 FILESTRAM 的數據庫
在SQL Server Managerment studio中,使用Transact-SQL創建數據庫
1: CREATE DATABASE Archive
2: ON
3: PRIMARY ( NAME = ArchiveMDF,
4: FILENAME = 'C:\MyData\archdat.mdf'), -- C:\MyData路徑必須存在
5: FILEGROUP FileStreamGroupFirst CONTAINS FILESTREAM( NAME = ArchiveFILESTREAM,
6: FILENAME = 'C:\MyData\MyFileStream') -- C:\MyData路徑下MyFileStream文件夾必須不存在
7: LOG ON ( NAME = ArchiveLDF,
8: FILENAME = 'C:\MyData\archlog.ldf')
9: GO
運行該腳本后
C:\MyData\MyFileStream 文件夾中會出現filestream.hdr 文件和 $FSLOG 文件夾。filestream.hdr 文件是重要的系統文件,它包含 FILESTREAM 頭信息。
啟用數據庫非事務性訪問級別
為了允許對 SQL Server 中存儲文件進行非事務性訪問,須在FileTable的數據上設置數據庫非事務性訪問級別。
修改數據庫非事務性訪問級別
1: ALTER DATABASE Archive
2: SET FILESTREAM ( NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'MyDirectory' ) -- 指定數據庫訪問級別和指定目錄名字
創建數據庫時設置非事務性訪問級別
1: CREATE DATABASE Archive
2: WITH FILESTREAM ( NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'MyDirectory' )-- 指定數據庫訪問級別和指定目錄名字
查看數據庫訪問級別
1: SELECT DB_NAME(database_id), non_transacted_access, non_transacted_access_desc
2: FROM sys.database_filestream_options;
3: GO
FileTable
FileTable 是用戶表,具有預定義的結構,為了存儲 FILESTREAM 數據、文件和目錄信息以及文件屬性。因此,創建 FileTable 時不需要指定列,但也可以指定,在此我只用最簡單的方式創建和使用FileTable。
不指定用戶定義值
1: CREATE TABLE DocumentStores AS FileTable;
2: GO
指定用戶定義值
1: CREATE TABLE DocumentStores AS FileTable
2: WITH
3: (
4: FileTable_Directory = 'DocumentStores',
5: FileTable_Collate_Filename = database_default
6: );
7: GO
在沒有指定用戶定義值時,FILETABLE_DIRECTORY 的值將為 FileTable 的名稱,FILETABLE_COLLATE_FILENAME 的值仍為database_default。
此時,就可以在數據庫Archive的數據庫 –> Tables –> FileTables,可以看到之前創建的FileTable表DocumentStores
在FileTable上右鍵 –> 瀏覽,可以直接復制文件到這個目錄,圖中我新建一個文本文檔。
也可以使用語句進行查詢
FileTable注意
不能將現有表轉換為FileTable。
必須完成上面的步驟啟用FILESTREAM設置和更改FILESTRAM設置。
由於FileTable 包含一個 FILESTREAM 列,因此FileTable 需要有效的 FILESTREAM 文件組。
不能在tempdb或任何其他系統數據庫中創建FileTable。
不能將FileTable作為臨時表。
不能更改 FILETABLE_COLLATE_FILENAME 的值。
不能更改、刪除或禁用 FileTable 系統定義的列。
不能將新的用戶列、計算列或持久化計算列添加到 FileTable。
刪除FileTable時,將刪除 FileTable 的所有列以及與該表關聯的所有對象,如索引、約束和觸發器。
刪除FileTable時,FileTable 目錄及其子目錄將從數據庫的 FILESTREAM 文件和目錄層次結構中消失。