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

適用於:SQL Server

描述 FileTable 如何搭配其他的 SQL Server 功能一起運作。

Always On 可用性群組和 FileTable

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

  • Always On 可用性群組支援 FileTable 的部分功能。 在容錯移轉之後,主要複本上的 FileTable 資料可供存取,但卻無法存取位在可讀取之次要複本上的 FileTable 資料。

    注意

    容錯移轉後,即可支援 FILESTREAM 的所有功能。 可讀取的次要複本以及新的主要複本上的 FILESTREAM 資料皆可供存取。

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

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

分割區和 FileTables

FileTable 不支援資料分割。 透過支援多個 FILESTREAM 檔案群組,在大多數情況下,單純的向上擴充問題即可在無須訴諸分割的情況下加以處理(這點不同於 SQL Server 2008 FILESTREAM)。

複寫與 FileTables

FileTable 不支援複寫和相關功能 (包括異動複寫、合併式複寫、異動資料擷取和變更追蹤)。

交易語義與 FileTables

Windows 應用程式

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

Transact-SQL 應用程式

對於在 FileTable 的 FILESTREAM (file_stream) 資料行中工作的 Transact-SQL 應用程式而言,隔離語意與一般使用者資料表內的 FILESTREAM 資料類型相同。

查詢通知與 FileTables

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

SELECT INTO 和 FileTables

FileTable 中的 SELECT INTO 陳述式將不會傳播目的地資料表上所建立的 FileTable 語意 (就像一般資料表中的 FILESTREAM 資料行一樣)。 目的地資料表中的所有資料行,其行為都與一般資料行完全相同。 它們不具任何與其相關聯的 FileTable 語意。

觸發程序和 FileTable

DDL (資料定義語言) 觸發程序

對於 FileTables 的 DDL 觸發程序,沒有特別的考量事項。 一般的 DDL 觸發器會觸發 Create/Alter 資料庫操作,以及 FileTables 的 CREATE/ALTER TABLE 操作。 觸發程序可以透過呼叫 EVENTDATA() 函數,擷取實際事件資料,該資料包括 DDL 命令文字和其他資訊。 現有 Eventdata 結構描述沒有任何新的事件或變更。

DML(資料操作語言)觸發器

在建立觸發程序的 DDL 作業期間,會強制套用這些限制。

  • FileTables 不支援用於 DML 操作的 INSTEAD OF 觸發程序。 這是所有包含 FILESTREAM 資料行之資料表的一項既有限制。

  • FileTables 支援 DML 作業的 AFTER 觸發程序。

  • 在 FileTable 上定義的觸發程序無法更新任何 FileTable(包括父 FileTable)。 這項限制主要是為了避免觸發器與同一筆交易中檔案系統存取所持有的鎖產生鎖定衝突。

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

  • 當某個資料庫允許非交易式更新存取時,您就可以針對任何資料表中的 FILESTREAM 資料進行就地更新,包括該資料庫中的 FileTable。 由於可能發生這種情況,觸發程序可能無法使用 FILESTREAM 內容的變更前映像。

  • 對於透過檔案系統進行的非交易式更新作業,SQL Server 會建立內部交易來記錄 CloseHandle 作業,而任何已定義的 DML 觸發程序都可能作為該交易的一部分而被觸發。 雖然無法防止觸發程序主體內部之這類交易的回復,不過這項操作不會回復已對 FILESTREAM 所做的變更。 這類回復作業也可能導致 UPDATE 觸發程序無法被觸發,即使 FILESTREAM 內容可能已經變更也是如此。

  • 除了這些影響以外,FileTable 的觸發程序也需要處理其他幾個行為

    • 透過檔案系統對 FileTable 執行非交易更新作業時,FILESTREAM 內容可能會遭其他 Win32 作業以獨佔方式鎖定,因此可能無法透過觸發程序主體進行讀取或寫入。 在這類情況下,任何嘗試在觸發程序主體內存取 FILESTREAM 內容的行為,都可能導致「共用違規」錯誤。 因此,觸發程序應該設計成可正確處理這類錯誤。

    • FILESTREAM 的 AFTER 影像可能並不穩定,因為在某些情況下,由於檔案系統存取允許的共用模式,該影像可能同時正被其他非交易式更新寫入。

  • Win32 控制碼的異常終止,例如由管理員明確強制終止 Win32 控制碼,或資料庫當機,在復原作業期間都不會執行使用者觸發程序,即使 FILESTREAM 內容可能已遭到該異常終止的 Win32 應用程式變更。

檢視表和 FileTable

視圖

可以在 FileTable 上建立檢視表,就像在任何其他資料表上建立一樣。 不過,對於在 FileTable 上建立的檢視,則有以下注意事項:

  • 檢視表不能具有任何 FileTable 語意。 例如,檢視表中的資料行 (包括 [檔案屬性] 資料行) 的行為就像一般檢視表資料行一樣,沒有任何特殊的語意,代表檔案/目錄的資料列也是相同情形。

  • 檢視表可能會依據「可更新的檢視表」語意來更新,但是基礎資料表條件約束可以拒絕更新,就像在資料表中一樣。

  • 檔案的檔案路徑可以在檢視表中視覺化,其方式是將它新增為檢視表中的明確資料行。 例如:

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

索引檢視

目前的索引檢視表不得包含 FILESTREAM 資料行,或是相依於 FILESTREAM 資料行的計算資料行/保存的計算資料行。 當 FileTable 上定義檢視表時,這個行為依然不會變更。

快照隔離和 FileTable

讀取認可快照隔離 (RCSI) 和快照隔離 (SI) 仰賴能夠為讀者提供資料快照,即使資料正在進行更新作業也是如此。 但是,FileTables 允許對 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)。

可讀取次要資料庫

如前一節快照隔離與 FileTables所述,適用於快照的相同考量也適用於可讀取的次要資料庫。

獨立資料庫和 FileTables

FileTable 功能相依的 FILESTREAM 功能必須先在資料庫外部進行一些設定。 因此,使用 FILESTREAM 或 FileTable 的資料庫並非完全自主。

若要使用內含資料庫的某些功能(例如內含使用者),可以將資料庫包含設定為 PARTIAL。 但在此情況下,某些資料庫設定不會包含在資料庫中,因此不會隨資料庫移動而自動移動。