FILESTREAM 概觀

許多資料都是未結構化的資料,例如文字文件、影像和視訊。這些未結構化的資料通常是儲存在資料庫外面 (與結構化資料分開)。這樣的分隔可能會造成資料管理更為複雜。或者,如果資料與結構化的儲存體有關聯,則檔案資料流處理的功能和效能可能會受到限制。

FILESTREAM 會將 SQL Server Database Engine 與 NTFS 檔案系統整合,其方式是將 varbinary(max) 二進位大型物件 (BLOB) 資料當做檔案儲存在檔案系統上。Transact-SQL 陳述式可以插入、更新、查詢、搜尋及備份 FILESTREAM 資料。Win32 檔案系統介面提供了資料的資料流方式存取。

FILESTREAM 會使用 NT 系統快取來儲存檔案資料。如此可減少 FILESTREAM 資料可能對 Database Engine 效能產生的任何影響。並不會使用 SQL Server 緩衝集區;因此,此記憶體可用於查詢處理。

[!附註]

即使啟用了透明資料加密,FILESTREAM 資料也不會加密。

如需示範如何使用 FILESTREAM 的逐步解說,請參閱<FILESTREAM 儲存體使用者入門>。

何時使用 FILESTREAM

在 SQL Server 中,BLOB 可以是將資料儲存在資料表中的標準 varbinary(max) 資料,或是將資料儲存在檔案系統中的 FILESTREAM varbinary(max) 物件。資料的大小和使用情況可決定您是應該使用資料庫儲存體還是檔案系統儲存體。如果下列條件成立,您應該考慮使用 FILESTREAM:

  • 平均來說,儲存的物件大於 1 MB。

  • 快速讀取權非常重要。

  • 您正在開發將中介層用於應用程式邏輯的應用程式。

如果是較小的物件,將 varbinary(max) BLOB 儲存在資料庫中通常會提供更好的資料流處理效能。

FILESTREAM 儲存體

FILESTREAM 儲存體會實作為 varbinary(max) 資料行,該資料行中的資料會當做 BLOB 儲存在檔案系統上。BLOB 的大小只受到檔案系統磁碟區大小的限制。標準 varbinary(max) 限制 (2-GB 檔案大小) 不適用於檔案系統中所儲存的 BLOB。

若要指定資料行應該將資料儲存在檔案系統上,請在 varbinary(max) 資料行上指定 FILESTREAM 屬性。如此會讓 Database Engine 將該資料行的所有資料都儲存在檔案系統上,而不是儲存在資料庫檔案中。

FILESTREAM 資料必須儲存在 FILESTREAM 檔案群組中。FILESTREAM 檔案群組是包含檔案系統目錄 (而非檔案本身) 的特殊檔案群組,這些檔案系統目錄稱為「資料容器」(Data Container)。資料容器是 Database Engine 儲存體與檔案系統儲存體之間的介面。 

當您使用 FILESTREAM 儲存體時,請考慮以下事項:

  • 當資料表包含 FILESTREAM 資料行時,每一個資料列都必須有唯一的非 Null 資料列識別碼。

  • FILESTREAM 資料容器無法巢狀化。

  • 當您正在使用容錯移轉叢集時,FILESTREAM 檔案群組必須在共用磁碟資源上。

  • FILESTREAM 檔案群組可以在壓縮的磁碟區上。

整合式安全性

在 SQL Server 中,系統會維護 FILESTREAM 資料的安全性,就像是維護其他資料的安全性一樣:在資料表或資料行層級上授與權限。如果使用者具有資料表中 FILESTREAM 資料行的權限,該使用者便可開啟關聯的檔案。

[!附註]

FILESTREAM 資料上不支援加密。

只有執行 SQL Server 服務帳戶所使用的帳戶會被授與 FILESTREAM 容器的 NTFS 權限。我們建議您不要將資料容器的權限授與給其他帳戶。

整合式管理

由於 FILESTREAM 會實作為 varbinary(max) 資料行,並直接整合到 Database Engine 中,所以大多數的 SQL Server 管理工具和功能不需要修改 FILESTREAM 資料即可運作。例如,您可以搭配 FILESTREAM 資料使用所有的備份和復原模型,而且 FILESTREAM 資料會與資料庫中的結構化資料一起備份。如果您不想要將 FILESTREAM 資料與關聯式資料一起備份,您可以使用部分備份來排除 FILESTREAM 檔案群組。

存取 BLOB 資料的雙重程式設計模型

在您將資料儲存在 FILESTREAM 資料行中以後,可以使用 Transact-SQL 交易或 Win32 API 來存取檔案。

Transact-SQL 存取

您可以藉由使用 Transact-SQL 來插入、更新和刪除 FILESTREAM 資料: 

  • 您可以使用插入作業,在 FILESTREAM 欄位中預先填入 null 值、空白值,或是相當簡短的內嵌資料。但是,將大量的資料當做資料流處理成使用 Win32 介面的檔案時,會比較有效率。

  • 當您更新 FILESTREAM 欄位時,您會修改檔案系統中的基礎 BLOB 資料。當 FILESTREAM 欄位設定為 NULL 時,與此欄位有關聯的 BLOB 資料會遭到刪除。您無法使用實作為 UPDATE**.**Write() 的 Transact-SQL 區塊更新來執行資料的部分更新。

  • 當您刪除資料列,或是刪除或截斷包含 FILESTREAM 資料的資料表時,您會刪除檔案系統中的基礎 BLOB 資料。

檔案系統資料流存取

Win32 資料流支援可在 SQL Server 交易的內容中運作。在交易內時,您可以使用 FILESTREAM 函數來取得檔案的邏輯 UNC 檔案系統路徑。然後,您可使用 OpenSqlFilestream API 取得檔案控制代碼。之後,此控制代碼可由 Win32 檔案資料流介面 (如 ReadFile()WriteFile()),所使用,以透過檔案系統來存取及更新檔案。 

由於檔案作業是交易式,所以您無法透過檔案系統來刪除或重新命名 FILESTREAM 檔案。

陳述式模型

FILESTREAM 檔案系統存取會使用檔案的開啟和關閉來建立 Transact-SQL 陳述式的模型。當檔案控制代碼開啟時,此陳述式便會開始,而當此控制代碼關閉時,此陳述式就會結束。例如,當寫入控制代碼關閉時,在資料表上註冊之任何可能的 AFTER 觸發程序便會引發,就像是 UPDATE 陳述式已完成一樣。

儲存體命名空間

在 FILESTREAM 中,Database Engine 會控制 BLOB 實體檔案系統命名空間。有一個新的內建函數 PathName 提供了對應至資料表內每一個 FILESTREAM 資料格之 BLOB 的邏輯 UNC 路徑。應用程式會使用此邏輯路徑來取得 Win32 控制代碼,並在 BLOB 資料上運作 (透過一般 Win32 檔案系統介面)。如果 FILESTREAM 資料行的值為 NULL,此函數就會傳回 NULL。

交易檔案系統存取

有一個新的內建函數 GET_FILESTREAM_TRANSACTION_CONTEXT() 提供了一個 Token,它代表與工作階段有關聯的目前交易。此交易必須已經開始,而且尚未中止或認可。應用程式會藉由取得 Token,將 FILESTREAM 檔案系統資料流作業與開始的交易繫結。如果沒有任何明確開始的交易,此函數就會傳回 NULL。

在認可或中止此交易之前,所有的檔案控制代碼都必須先關閉。如果有控制代碼在交易範圍之外仍然為開啟狀態,針對此控制代碼的其他讀取將會造成失敗;對此控制代碼的其他寫入將會成功,因為實際資料將不會寫入磁碟中。同樣地,如果關閉了 Database Engine 的資料庫或執行個體,則所有開啟的控制代碼都將會失效。

交易持續性

使用 FILESTREAM 時,Database Engine 會在交易認可之後確保從檔案系統資料流存取修改之 FILESTREAM BLOB 資料的交易持續性。

從遠端用戶端寫出

遠端檔案系統對 FILESTREAM 資料的存取,是透過伺服器訊息區塊 (SMB) 通訊協定來啟用。如果用戶端在遠端,則用戶端不會快取任何寫入作業。寫入作業一定會傳送給伺服器,資料可以在伺服器端快取。我們建議您將在遠端用戶端上執行的應用程式合併小型寫入作業,以便使用較多的資料來減少寫入作業。

使用 FILESTREAM 控制代碼來建立記憶體對應檢視 (記憶體對應 I/O) 不受到支援。如果將記憶體對應用於 FILESTREAM 資料,Database Engine 將無法保證資料的一致性與持續性或是資料庫的完整性。

Windows 標誌憑證

FILESTREAM RsFx 驅動程式經認證可用於 Windows Server 2008 R2。如需詳細資訊以及目錄檔案下載,請參閱 Microsoft 下載中心的<SQL Server 2008 R2 FileStream 驅動程式 Windows 標誌憑證>。