使用檔案 I/O API 存取 FileTable

描述檔案系統 I/O 如何在 FileTable 上運作。

本主題內容

我想要…

  • 開始使用 FileTable 檔案的 I/O API

  • 在 FileTable 中建立檔案和目錄

  • 讀取 FileTable 中的檔案和目錄

  • 更新 FileTable 中的檔案和目錄

  • 刪除 FileTable 中的檔案和目錄

深入了解

  • 支援的檔案系統作業

  • FileTable 之檔案 I/O 存取的其他考量

    • 使用虛擬網路名稱 (VNN) 搭配 AlwaysOn 可用性群組

    • 部分更新

    • 交易式語意

    • 並行存取控制

    • 觸發程序

  • FileTable 中支援的檔案系統功能

開始使用 FileTable 檔案的 I/O API

FileTable 的主要用法是透過 Windows 檔案系統和檔案 I/O API。 FileTable 支援透過一系列可用檔案 I/O API 的非交易式存取。

  1. 檔案 I/O API 存取通常一開始會先取得檔案或目錄的邏輯 UNC 路徑。 應用程式可以搭配 GetFileNamespacePath (Transact-SQL) 函數使用 Transact-SQL 陳述式,以取得檔案或目錄的邏輯路徑。 如需詳細資訊,請參閱<使用 FileTables 中的目錄與路徑>。

  2. 然後應用程式會使用此邏輯路徑以取得檔案或目錄控制代碼,並對物件進行操作。 該路徑可傳遞至任何支援的檔案系統 API 函數,例如 CreateFile() 或 CreateDirectory(),以建立或開啟檔案並取得控制代碼。 控制代碼隨後便可用於以資料流形式處理資料、列舉或組織目錄、取得或設定檔案屬性、刪除檔案或目錄等。

[回到頁首]

在 FileTable 中建立檔案和目錄

透過呼叫檔案 I/O API (例如 CreateFile 或 CreateDirectory) 在 FileTable 中建立檔案或目錄。

  • 支援所有建立配置旗標、共用模式及存取模式。 其中包括檔案建立、刪除及就地修改。 同時支援檔案命名空間更新,亦即 目錄建立/刪除、重新命名及移動作業。

  • 新檔案或目錄的建立會對應到基礎 FileTable 中新資料列的建立。

  • 若為檔案,資料流資料會儲存在 file_stream 資料行中;若為目錄,此資料行為 null。

  • 若為檔案,is_directory 資料行內含 false。 若為目錄,此資料行內含 true。

  • 當多個並行的檔案 I/O 作業或 Transact-SQL 作業在階層中影響同一個檔案或目錄時,會強制執行共用存取及並行存取。

[回到頁首]

讀取 FileTable 中的檔案和目錄

若為所有資料流及屬性資料的檔案 I/O 存取作業,SQL Server 會強制執行讀取認可隔離語意。

[回到頁首]

寫入及更新 FileTable 中的檔案和目錄

  • 所有 FileTable 上的檔案 I/O 寫入或更新作業都是非交易式的。 也就是說,不會有任何 SQL Server 交易繫結至這些作業,而且不會提供任何 ACID 保證。

  • FileTable 支援所有檔案 I/O 資料流/就地更新。

  • 透過檔案 I/O API 進行的 FILESTREAM 資料或屬性更新都將更新 FileTable 中對應的 file_stream 及對應的檔案屬性資料行。

[回到頁首]

刪除 FileTable 中的檔案和目錄

當您刪除檔案或目錄時會強制執行所有 Windows 檔案 I/O API 語意。

  • 如果目錄中包含任何檔案的子目錄,將無法刪除目錄。

  • 刪除檔案或目錄將會從 FileTable 中移除對應的資料列。 這相當於透過 Transact-SQL 作業刪除該資料列。

[回到頁首]

支援的檔案系統作業

FileTable 支援與下列檔案系統作業相關的檔案系統 API:

  • 目錄管理

  • 檔案管理

FileTable 不支援下列作業:

  • 磁碟管理

  • 磁碟區管理

  • 交易式 NTFS

[回到頁首]

FileTable 之檔案 I/O 存取的其他考量

使用虛擬網路名稱 (VNN) 搭配 AlwaysOn 可用性群組

當包含 FILESTREAM 或 FileTable 資料的資料庫屬於 AlwaysOn 可用性群組時,透過檔案系統 API 對 FILESTREAM 或 FileTable 資料進行的所有存取都應該使用 VNN 而非電腦名稱。 如需詳細資訊,請參閱<FILESTREAM 和 FileTable 與 AlwaysOn 可用性群組 (SQL Server)>。

部分更新

使用 GetFileNamespacePath (Transact-SQL) 函數在 FileTable 中取得的 FILESTREAM 資料可寫入控制代碼,可用於執行 FILESTREAM 內容的就地、部分更新。 此行為與交易 FILESTREAM 存取不同,它是透過呼叫 OpenSQLFILESTREAM() 及傳遞明確交易內容所取得的控制代碼來進行。

[回到頁首]

交易式語意

當您使用檔案 I/O API 於 FileTable 中存取檔案時,這些作業不會與任何使用者交易有關聯,並且具有下列其他特性:

  • FileTable 中 FILESTREAM 資料的非交易式存取與任何交易無關,因此不會有任何特定的隔離語意。 但 SQL Server 可能會使用內部交易,針對 FileTable 資料強制執行鎖定或並行語意。 此類型的任何內部交易都已完成讀取認可隔離。

  • 這些 FILESTREAM 資料上的非交易作業沒有任何 ACID 保證。 一致性保證類似於檔案系統上應用程式所建立的檔案更新。

  • 這些變更無法回復。

但是,FileTable 中的 FILESTREAM 資料行也可以透過呼叫 OpenSqlFileStream(),與交易式 FILESTREAM 存取一同進行存取。 這種存取可以完全為交易式,而且會接受目前一致支援的所有交易式層級。

[回到頁首]

並行存取控制

SQL Server 會在檔案系統應用程式之間以及檔案系統應用程式和 Transact-SQL 應用程式之間強制執行 FileTable 存取的並行存取控制。 達成此並行存取控制的方式是針對 FileTable 資料列採取適當的鎖定。

[回到頁首]

觸發程序

透過檔案系統建立、修改、或刪除檔案或目錄或其屬性,將會導致 FileTable 中對應的插入、更新或刪除作業。 任何關聯的 Transact-SQL DML 觸發程序都會當做這些作業的一部分引發。

[回到頁首]

FileTable 中支援的檔案系統功能

功能

支援

註解

Oplock

是

支援層級 2、層級 1、批次和篩選器 oplock。

擴充屬性

否

重新剖析點

否

持續的 ACL

否

具名資料流

否

疏鬆檔案

是

疏鬆性只能在檔案上設定,而且會影響資料流的儲存方式。 FILESTREAM 資料儲存在 NTFS 磁碟區上,因此 FileTable 功能會將要求轉送至 NTFS 檔案系統以支援疏鬆檔案。

壓縮

是

加密

是

TxF

否

檔案識別碼

否

物件識別碼

否

符號連結

否

永久連結

否

簡短名稱

否

目錄變更通知

否

位元組範圍鎖定

是

位元組範圍鎖定的要求會傳遞到 NTFS 檔案系統。

記憶體對應檔案

否

取消 I/O

是

安全性

否

系統會強制執行 Windows 共用層級安全性和 SQL Server 資料表與資料行層級安全性。

USN 日誌

否

FileTable 和 DML 作業中檔案和目錄的中繼資料變更為 SQL Server 資料庫上的 DML 作業。 因此,這些會記錄在對應的資料庫記錄檔中。 但是,並不會記錄在 NTFS USN 日誌中 (除非大小有變更)。

SQL Server 變更追蹤功能可用於取得類似的資訊。

[回到頁首]

請參閱

概念

載入檔案至 FileTable

使用 FileTables 中的目錄與路徑

利用 Transact-SQL 存取 FileTable

FileTable DDL、函數、預存程序及檢視