總帳考量與限制
適用於:SQL Server 2022 (16.x) Azure SQL 資料庫 Azure SQL 受控執行個體
使用總帳資料表時由於系統版本設定和不可變資料的性質使然,必須了解一些考量與限制。
一般功能考量和限制
使用總帳時,請考慮下列事項。
- 總帳資料庫是總帳屬性設定為開啟的資料庫,無法轉換成一般資料庫,因其總帳屬性設定為關閉。
- Azure SQL Database 目前提供資料庫摘要自動產生和儲存,但 SQL Server 不支援這些功能。
- 使用 Azure 儲存體不可變 Blob 設定總帳資料表的自動化摘要管理,會讓使用者無法使用本地備援儲存體 (LRS) 帳戶。
- 建立總帳資料庫時,在資料庫中建立的所有新資料表 (未指定
APPEND_ONLY = ON
子句) 預設都是可更新的總帳資料表。 若要建立僅附加總帳資料表,請在 CREATE TABLE (Transact-SQL) 陳述式中使用APPEND_ONLY = ON
子句。 - 交易最多可以更新 200 個總帳資料表。
總帳資料表考量與限制
- 資料庫中不是總帳資料表的現有資料表,無法轉換成總帳資料表。 如需詳細資訊,請參閱將資料從一般資料表移轉至總帳資料表。
- 建立總帳資料表之後,就無法將其還原為不是總帳資料表的資料表。
- 不支援在僅附加總帳資料表中刪除較舊的資料,或在可更新的總帳資料表中刪除歷程記錄資料表。
- 不支援
TRUNCATE TABLE
。 - 建立可更新的總帳資料表時,會將四個 GENERATED ALWAYS 資料行新增至總帳資料表。 僅附加總帳資料表會將兩個資料行新增至總帳資料表。 這些新資料行計數會列入 Azure SQL Database 支援的最大資料行數目 (1024)。
- 不支援記憶體內部資料表。
- 不支援疏鬆資料行集。
- 不支援 SWITCH IN/OUT 分割區。
- 不支援 DBCC CLONEDATABASE。
- 總帳資料表不能有全文檢索索引。
- 總帳資料表不能是圖形資料表。
- 總帳資料表不能是 FileTable。
- 當總帳資料表具有叢集資料行存放區索引時,不能有資料列存放區非叢集索引。
- 歷程記錄資料表不允許變更追蹤,但總帳資料表允許。
- 歷程記錄資料表不允許異動資料擷取,但總帳資料表允許。
- 總帳資料表不支援異動複寫。
- 不支援資料庫鏡像。
- 支援 Azure Synapse Link,但僅限總帳資料表,不適用於歷程記錄資料表。
- 將資料庫備份原生還原至 Azure SQL 受控執行個體之後,手動變更摘要路徑。
- 在建立 Azure SQL 受控執行個體的受控執行個體連結之後,手動變更摘要路徑。
- 總帳資料表不支援 SQL 資料同步。
不支援的資料類型
- XML
- SqlVariant
- 使用者定義資料類型
- FILESTREAM
暫存資料表限制
可更新的總帳資料表是以時態表技術為基礎,並繼承大部分的限制,但非全部。 以下是繼承自時態表的限制清單。
- 若在建立歷程記錄資料表時指定歷程記錄資料表名稱,則您必須指定結構描述和資料表名稱,還有總帳總帳名稱。
- 根據預設,歷程記錄資料表會採 PAGE 壓縮處理。
- 若目前的資料表已分割,則會在預設檔案群組上建立歷程記錄資料表,這是因為資料分割設定不會自動從目前的資料表複寫至歷程記錄資料表。
- 時態表和歷程記錄資料表不能是 FILETABLE,而且可以包含 FILESTREAM 以外任何支援的資料類型資料行。 FILETABLE 和 FILESTREAM 允許 SQL Server 外部的資料操作,因此無法保證系統版本設定。
- 節點或邊緣資料表無法建立為或改變為時態表。 總帳不支援圖形。
- 時態表支援 blob 資料類型 (例如
(n)varchar(max)
、varbinary(max)
、(n)text
和image
),但會產生龐大的儲存成本,且其大小會影響效能。 因此您在設計系統時,應小心使用這些資料類型。 - 歷程記錄資料表必須建立於與目前資料表相同的資料庫中。 不支援透過連結的伺服器執行時態表查詢。
- 歷程記錄資料表不可有條件約束 (主索引鍵、外部索引鍵、資料表或資料行條件約束)。
- 如果系統版本設定為時態表,則連線選項 (
WITH (ONLINE = ON
) 不會對ALTER TABLE ALTER COLUMN
造成任何作用。 因為不論ONLINE
選項指定的值為何,ALTER COLUMN
都不會以連線方式執行。 INSERT
和UPDATE
陳述式不能參考 GENERATED ALWAYS 資料行。 若嘗試將值直接插入這些資料行,則會遭到系統封鎖。- 不支援
UPDATETEXT
和WRITETEXT
。 - 不允許歷程記錄資料表上的觸發程序。
- 能使用的複寫技術有限:
- Always On:完全支援
- 快照集、合併和異動複寫:時態表不支援
- 歷程記錄資料表不可設定為一連串歷程記錄資料表中的目前資料表。
- 建立歷程記錄資料表時,下列物件或屬性不會從目前的資料表複寫到歷程記錄資料表:
- 期間定義
- 識別定義
- 索引
- 統計資料
- 檢查條件約束
- 觸發程序
- 資料分割設定
- 權限
- 資料列層級安全性述詞
結構描述變更考量
新增資料行
支援新增可為 Null 的資料行。 不支援新增不可為 Null 的資料行。 總帳的設計目的是在計算資料列版本雜湊時忽略 Null 值。 因此,新增可為 Null 的資料行時,總帳會修改總帳和歷程記錄資料表的結構描述,以包含新的資料行,不過這並不會影響現有資料列的雜湊。 在總帳資料表中新增資料行可在 sys.ledger_column_history 中擷取。
卸除資料行和資料表
一般而言,卸除資料行或資料表會完全清除資料庫中的基礎資料,而且基本上,與要求資料必須不可變的總帳功能不相容。 總帳只要重新命名要卸除的物件,就不用刪除資料,在邏輯上,資料會從使用者結構描述中移除,但實際上,卻仍保留在資料庫中。 總帳資料表結構描述也會隱藏任何卸除的資料行,讓使用者應用程式看不到這些資料行。 不過,這類卸除物件的資料仍可供總帳驗證程序使用,且可讓使用者透過對應的總帳檢視來檢查任何歷程記錄資料。 在總帳資料表中卸除資料行可在 sys.ledger_column_history 中擷取。 卸除總帳資料表可在 sys.ledger_table_history 中擷取。 卸除總帳資料表及其相依物件會在系統目錄檢視中標示為已卸除,並重新命名:
- 在 sys.tables 中設定
is_dropped_ledger_table
會將已卸除的總帳資料表標示為已卸除,然後使用下列格式重新命名:MSSQL_DroppedLedgerTable_<dropped_ledger_table_name>_<GUID>
。 - 使用下列格式重新命名可更新總帳資料表的已卸除歷程記錄資料表:
MSSQL_DroppedLedgerHistory_<dropped_history_table_name>_<GUID>
。 - 在 sys.views 中設定
is_dropped_ledger_view
會將已卸除的總帳檢視標示為已卸除,然後使用下列格式重新命名:MSSQL_DroppedLedgerView_<dropped_ledger_view_name>_<GUID>
。
注意
如果重新命名的資料表或檢視的長度超過 128 個字元,卸除的總帳資料表、歷程記錄資料表和總帳檢視的名稱可能會被截斷。
改變資料行
支援任何不會影響總帳資料表基礎資料的變更,無需任何特殊處理,因為變更不會影響總帳中擷取的雜湊。 這些變更包括:
- 測試可 NULL 性
- Unicode 字串定序
- 可變長度資料行的長度
不過,不支援任何可能會影響現有資料格式的作業,例如變更資料類型。