1. 程式人生 > 其它 >[SQLServer大物件]——FileTable初體驗

[SQLServer大物件]——FileTable初體驗

在我接觸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:MyDataarchdat.mdf'),      -- C:MyData路徑必須存在
   5:  FILEGROUP FileStreamGroupFirst CONTAINS FILESTREAM( NAME = ArchiveFILESTREAM,
   6:      FILENAME = 'C:MyDataMyFileStream')      -- C:MyData路徑下MyFileStream資料夾必須不存在
   7:  LOG ON  ( NAME = ArchiveLDF,
   8:      FILENAME = 'C:MyDataarchlog.ldf')
   9:  GO

執行該指令碼後

C:MyDataMyFileStream 資料夾中會出現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 檔案和目錄層次結構中消失。