FileTable 與其他 SQL Server 功能的相容性

描述 FileTable 如何使用 SQL Server 的其他功能。

AlwaysOn 可用性群組和 FileTables

當包含 FILESTREAM 或 FileTable 資料的資料庫屬於 AlwaysOn 可用性群組時:

  • AlwaysOn 可用性群組部分支援 FileTable 功能。 故障轉移之後,主要復本可存取 FileTable 資料,但可讀取次要復本無法存取 FileTable 資料。

    備註

    注意,在故障轉移之後,所有 FILESTREAM 的功能都受到支援。 FILESTREAM 數據可在可讀取的次要複本和新的主要複本上存取。

  • FILESTREAM 和 FileTable 函數會接受或傳回虛擬網路名稱 (VNN) 而非電腦名稱。 如需有關這些函式的詳細資訊,請參閱 Filestream 和 FileTable 函式 (Transact-SQL)。

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

分割區和 FileTable

FileTable 不支持數據分割。 在支援多個 FILESTREAM 檔案群組的情況下,大部分情境中的純加速擴展問題可以得到處理,而無需訴諸分割(與 SQL 2008 FILESTREAM 不同)。

復寫和文件表

FileTable 不支持複寫和相關功能(包括事務複製、合併式複寫、異動數據擷取和變更追蹤)。

交易語意和 FileTable

Windows 應用程式
Windows 應用程式不了解資料庫交易,因此 Windows 寫入作業不會提供資料庫交易的 ACID 屬性。 因此,Windows 更新作業無法進行交易式回復和復原。

Transact-SQL 應用程式
對於在 FileTable 中處理 FILESTREAM (file_stream) 資料行的 TSQL 應用程式,隔離語意與一般用戶數據表中的 FILESTREAM 數據類型相同。

查詢通知和 FileTable

查詢不能包含對 FileTable 中的 FILESTREAM 資料行的參考,無論是在 WHERE 子句中,或其他任何查詢部分。

SELECT INTO 和 FileTables

FileTable 中的 SELECT INTO 語句不會在建立的目的地數據表上傳播 FileTable 語意(就像一般數據表中的 FILESTREAM 數據行一樣)。 所有目的表格的欄位將像普通欄位一樣運作。 它們不會有任何與 FileTable 相關的概念。

觸發程式和 FileTable

DDL (資料定義語言) 觸發程式
使用 FileTable 的 DDL 觸發程序沒有特別需要考慮的事項。 一般的 DDL 觸發器會觸發 Create/Alter 資料庫操作,以及 FileTables 的 CREATE/ALTER TABLE 操作。 觸發程式可以藉由呼叫 EVENTDATA() 函式來擷取包含 DDL 命令文字和其他資訊的實際事件數據。 現有的 Eventdata 架構沒有任何新事件或變更。

DML (資料操作語言)觸發程式
這些限制將在 DDL 操作期間強制執行,以建立觸發器。

  • FileTable 不支援 DML 作業的 INSTEAD OF 觸發器。 這是所有包含 FILESTREAM 資料行之數據表的現有限制。

  • FileTables 將支援 DML 作業的 AFTER 類型的觸發程式。

  • FileTable 上定義的觸發器無法更新任何 FileTable(包括父 FileTable)。 這項限制主要是為了防止觸發程式在相同交易中與文件系統存取所持有的鎖定發生鎖定衝突。

非交易式存取及其對觸發程序的影響

  • 當資料庫中允許非交易式更新存取時,可以在任何數據表中就地更新 FILESTREAM 數據,包括該資料庫中的 FileTable。 由於這種可能性,觸發程式可能無法使用 FILESTREAM 內容之前的影像。

  • 若是透過檔案系統進行非交易更新作業,SQL Server 會建立內部交易來擷取 CloseHandle 作業,而任何已定義的 DML 觸發程序可能會在該交易中運作。 在觸發程式主體內復原這類交易,雖然未防止,但不會回復對 FILESTREAM 所做的變更。 即使 FILESTREAM 內容可能已變更,這類回滾也可能會防止更新觸發器被觸發。

  • 除了這些影響之外,FileTable 上的觸發程式還需要處理幾個額外的行為

    • 如果是透過檔案系統在 FileTable 上進行非交易式更新操作,FILESTREAM 內容可能會被其他 Win32 操作獨佔鎖定,並且在觸發程序的主體中可能無法進行讀取/寫入。 在這種情況下,任何嘗試存取觸發器程式碼內的 FILESTREAM 資料內容,都可能會發生「共用違規」錯誤。 觸發程式應設計為適當地處理這類錯誤。

    • FILESTREAM 的 AFTER 映像可能不穩定,因為在某些情況下,它可能會被其他非交易更新同時寫入(由於檔案系統存取中允許的共享模式)。

  • Win32 控制碼的異常終止,如系統管理員強制終止 Win32 控制碼或資料庫崩潰,即使 FILESTREAM 內容可能已被異常終止的 Win32 應用程式更改,將不會在復原操作期間執行使用者觸發器。

視圖和 FileTables

瀏覽次數
您可以在 FileTable 上建立檢視,如同任何其他數據表一樣。 不過,下列考慮適用於在 FileTable 上建立的檢視:

  • 檢視不會有任何 FileTable 語意。 也就是檢視中的數據行(包括檔案屬性數據行)的行為就像沒有任何特殊語意的一般檢視數據行一樣,而且代表檔案/目錄的數據列也是如此。

  • 檢視可能會根據「可更新檢視」語意進行更新,但基礎表條件約束可能會拒絕更新,就像在數據表中一樣。

  • 檔案路徑可以在檢視中作為顯式欄位來視覺化顯示。 例如:

    CREATE VIEW MP3FILES AS SELECT column1, column2, ..., GetFileNamespacePath() AS PATH, column3,... FROM Documents

索引檢視表
目前索引檢視表不能包含 FILESTREAM 資料行或相依於 FILESTREAM 資料行的計算/保存計算資料行。 此行為在 FileTable 上定義的視圖中也保持不變。

快照隔離和檔案表格

即使資料正在進行更新操作,讀取認可快照隔離(RCSI)和快照隔離(SI)仍依賴於讀取器可以存取資料快照的功能。 不過,FileTable 允許對 Filestream 數據進行非交易式寫入存取。 因此,下列限制適用於在包含 FileTable 的資料庫中使用這些功能:

  • 可以變更包含 FileTable 的資料庫,以啟用 RCSI/SI。

  • 當資料庫的非交易性存取設定為 FULL 時,則在 RCSI 或 SI 下執行的交易會具有以下行為:

    • FileTable 的 file_stream 欄中的任何 Transact-SQL 讀取都失敗。 INSERT UPDATE只要不從file_stream欄讀出,仍成功。

    • 如果 Transact-SQL 語句指定 READCOMMITTEDLOCK 數據表提示,則讀取會成功,並鎖定數據列,而不是使用數據列版本設定。

    • 交易的 Win32 FileStream 開啟要求也失敗。

    • 非交易的 FileTable Win32 存取成功。 FileTable 所完成的所有內部查詢都不會受到影響。

    • 不論資料庫選項為何(READ_COMMITTED_SNAPSHOT或ALLOW_SNAPSHOT_ISOLATION),全文檢索索引一律會成功。

可讀取的輔助資料庫

與快照相同的考量同樣適用於可讀的輔助資料庫,如上一節快照隔離和檔案表格中所述。

封裝資料庫和 FileTable

FileTable 功能相依的 FILESTREAM 功能需要資料庫外部的一些設定。 因此,使用 FILESTREAM 或 FileTable 的資料庫不是完全封閉的。

如果您想要使用自主資料庫的特定功能,例如自主使用者,您可以將資料庫內含項目設定為 PARTIAL。 不過,在此情況下,您必須注意某些資料庫設定未包含在資料庫中,而且不會在資料庫移動時自動移動。

另請參閱

管理 FileTable