共用方式為


可更新的總帳資料表

適用於:SQL Server 2022 (16.x) Azure SQL 資料庫 Azure SQL 受控執行個體

可更新總帳資料表是由系統建立版本的資料表,使用者可以在這些資料表中執行更新和刪除,同時也提供防竄改功能。 發生更新或刪除時,資料列的所有舊版都會保留在次要資料表中,稱為歷程記錄資料表。 歷程記錄資料表會反映可更新總帳資料表的結構描述。 更新資料列時,資料列的最新版本會保留在總帳資料表中,而系統會以對應用程式而言透明的方式將其較早的版本插入歷程記錄資料表中。

可更新的總帳資料表和時態表都是由系統建立版本的資料表,資料庫引擎會在次要歷程記錄資料表中擷取歷程記錄資料列版本。 這兩種技術都提供獨特的優點。 可更新總帳資料表讓目前和歷程記錄資料都能夠防竄改。 時態表支援查詢在任何時間點儲存的資料,而不是只查詢在目前時間點的資料。 您可以藉由建立同時是可更新總帳資料表和時態表的資料表,同時使用這兩種技術。

此圖顯示總帳資料表架構。

您可以在 CREATE DATABASE (Transact-SQL) 陳述式中指定 LEDGER = ON 引數,藉此建立可更新的總帳資料表。

提示

在總帳資料庫中建立可更新的總帳資料表時,LEDGER = ON 為選用。 在總帳資料庫中,每個資料表預設都是可更新的總帳資料表。

如需在您的 T-SQL 陳述式中指定 LEDGER 引數時可用選項的詳細資訊,請參閱 CREATE TABLE (Transact-SQL)

重要

建立總帳資料表之後,就無法將其還原為不是總帳資料表的資料表。 因此,攻擊者無法暫時移除總帳資料表上的總帳功能、進行變更,然後再重新啟用總帳功能。

可更新總帳資料表結構描述

可更新總帳資料表必須具有下列 GENERATED ALWAYS 資料行,其中所含的中繼資料指出哪些交易對資料表進行了變更,以及交易更新資料列的作業順序。 此資料適合用來鑑識,以了解資料在一段時間內的插入方式。

如果您未在 CREATE TABLE (Transact-SQL) 陳述式中指定總帳資料表和總帳歷程記錄資料表的必要 GENERATED ALWAYS 資料行,則系統會自動新增資料行並且使用下列預設名稱。 如需詳細資訊,請參閱建立可更新總帳資料表中的範例。

預設資料行名稱 資料類型 描述
ledger_start_transaction_id BIGINT 建立資料列版本的交易 ID
ledger_end_transaction_id BIGINT 刪除資料列版本的交易 ID
ledger_start_sequence_number BIGINT 建立資料列版本的交易所執行的作業序號
ledger_end_sequence_number BIGINT 刪除資料列版本的交易所執行的作業序號

記錄資料表

當建立可更新的總帳資料表時,就會自動建立歷程記錄資料表。 歷程記錄資料表會因為可更新總帳資料表中的更新和刪除,而擷取已變更的資料列歷程記錄值。 歷程記錄資料表的結構描述會鏡像與其相關聯可更新總帳資料表的結構描述。

當您建立可更新總帳資料表時,可以指定要包含歷程記錄資料表的結構描述名稱和歷程記錄資料表的名稱,或是讓系統產生歷程記錄資料表的名稱,並將其新增至與總帳資料表相同的結構描述中。 具有系統所產生名稱的歷程記錄資料表稱為匿名歷程記錄資料表。 匿名歷程記錄資料表的命名慣例是 <schema>.<updatableledgertablename>.MSSQL_LedgerHistoryFor_<GUID>

總帳檢視

針對每個可更新總帳資料表,系統會自動產生稱為總帳檢視的檢視表。 總帳檢視是可更新總帳資料表與其相關聯歷程記錄資料表的聯結。 總帳檢視會藉由聯結歷程記錄資料表中的歷程記錄資料,來報告可更新總帳資料表上發生的所有資料列修改。 此檢視可讓使用者、其合作夥伴或稽核員分析所有歷程記錄作業以及偵測可能的竄改。 每個資料列作業都會伴隨著作用中交易的識別碼,以及作業是 DELETEINSERT。 使用者可以擷取交易執行時間的詳細資訊,以及執行該交易的使用者身分識別,並將其與此交易所執行的其他作業相互關聯。

例如,如果您想要追蹤銀行案例的交易歷程記錄,總帳檢視會提供一段時間內的交易歷程記錄。 藉由使用總帳檢視,您就不需要獨立地檢視可更新總帳資料表和歷程記錄資料表,也不需要建立您自己的檢視。

如需使用總帳檢視的範例,請參閱建立和使用可更新總帳資料表

總帳檢視的結構描述會鏡像可更新總帳和歷程記錄資料表中定義的資料行,但是 GENERATED ALWAYS 資料行與可更新總帳和歷程記錄資料表中的資料行不同。

總帳檢視結構描述

注意

當您使用 <ledger_view_option> 參數搭配 CREATE TABLE (Transact-SQL) 陳述式來建立資料表時,可以自訂總帳檢視資料行名稱。 如需詳細資訊,請參閱 CREATE TABLE (Transact-SQL) 中的總帳檢視選項及對應範例。

預設資料行名稱 資料類型 描述
ledger_transaction_id BIGINT 建立或刪除資料列版本的交易 ID。
ledger_sequence_number BIGINT 資料表中交易發生的資料列層級作業序號。
ledger_operation_type TINYINT 包含 1 (INSERT) 或 2 (DELETE)。 在總帳資料表中插入資料列,即會在總帳檢視中產生一列新的資料列且在這個資料行中含有 1。 從總帳資料表刪除資料列,即會在總帳檢視中產生一列新的資料列且在這個資料行中含有 2。 在總帳資料表中更新資料列時,會在總帳檢視中產生兩列新的資料列。 其中一列的這個資料行含有 2 (DELETE),另一列則含有 1 (INSERT)。
ledger_operation_type_desc nvarchar(128) 包含 INSERTDELETE。 如需詳細資訊,請參閱前一資料列。