使用檔案輸入輸出 API 存取 FileTable
適用於:SQL Server
描述檔案系統 I/O 如何在 FileTable 上運作。
開始使用 FileTable 檔案的 I/O API
FileTable 的主要用法是透過 Windows 檔案系統和檔案 I/O API。 FileTable 支援透過一系列可用檔案 I/O API 的非交易式存取。
檔案 I/O API 存取通常一開始會先取得檔案或目錄的邏輯 UNC 路徑。 應用程式可以搭配 GetFileNamespacePath (Transact-SQL) 函數使用 Transact-SQL 陳述式,以取得檔案或目錄的邏輯路徑。 如需詳細資訊,請參閱 Work with Directories and Paths in FileTables。
然後應用程式會使用此邏輯路徑以取得檔案或目錄控制代碼,並對物件進行操作。 該路徑可傳遞至任何支援的檔案系統 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 中檔案和目錄的中繼資料變更為 SQL Server 資料庫上的 DML 作業。 因此,這些會記錄在對應的資料庫記錄檔中。 但是,並不會記錄在 NTFS USN 日誌中 (除非大小有變更)。 SQL Server 變更追蹤功能可用於取得類似的資訊。 |
另請參閱
載入檔案至 FileTable
使用 FileTable 中的目錄與路徑
利用 Transact-SQL 存取 FileTable
FileTable DDL、函數、預存程序及檢視