適用於: SQL Server 2022 (16.x) 及更新版本
Azure SQL Database
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 |
| 帳本_起始_序號 | Bigint | 在交易內建立資料列版本之作業的序號 |
| 帳本結束序號 | Bigint | 交易中刪除資料列版本之作業的序號 |
歷程資料表
當建立可更新的總帳資料表時,就會自動建立歷程記錄資料表。 歷程記錄資料表會擷取可更新總帳資料表中因更新和刪除而變更之資料列的歷史值。 歷程記錄資料表的結構描述與其相關聯的可更新總帳資料表相同。
當您建立可更新總帳資料表時,可以指定要包含歷程記錄資料表的結構描述名稱和歷程記錄資料表的名稱,或是讓系統產生歷程記錄資料表的名稱,並將其新增至與總帳資料表相同的結構描述中。 具有系統所產生名稱的歷程記錄資料表稱為匿名歷程記錄資料表。 匿名歷程記錄資料表的命名慣例是 <schema>.<updatableledgertablename>.MSSQL_LedgerHistoryFor_<GUID>。
總帳檢視
針對每個可更新總帳資料表,系統會自動產生稱為總帳檢視的檢視表。 帳本檢視是由可更新的帳本資料表及其相關聯的歷程資料表聯結而成。 分類帳檢視會藉由聯結歷史資料表中的歷史資料,顯示可更新分類帳資料表上已發生的所有資料列修改。 此檢視可讓使用者、其合作夥伴或稽核員分析所有歷程記錄作業以及偵測可能的竄改。 每個資料列作業都會附帶執行該操作的交易 ID,以及該操作是 DELETE 或 INSERT。 使用者可以擷取交易執行時間的詳細資訊,以及執行該交易的使用者身分識別,並將其與此交易所執行的其他作業相互關聯。
例如,如果您想要追蹤銀行案例的交易歷程記錄,總帳檢視會提供一段時間內的交易歷程記錄。 藉由使用總帳檢視,您就不需要獨立地檢視可更新總帳資料表和歷程記錄資料表,也不需要建立您自己的檢視。
如需使用總帳檢視的範例,請參閱建立和使用可更新總帳資料表。
總帳檢視表的結構描述會對應可更新總帳和歷史資料表中定義的資料行,但 GENERATED ALWAYS 資料行則不同於可更新總帳和歷史資料表中的資料行。
總帳檢視結構描述
注意
您可以在建立資料表時,搭配 CREATE TABLE (Transact-SQL) 陳述式使用 <ledger_view_option> 參數,自訂帳本檢視中的資料行名稱。 欲了解更多資訊,請參閱帳本檢視選項及(Transact-SQL)中的相應範例CREATE TABLE。
| 預設資料行名稱 | 資料類型 | 描述 |
|---|---|---|
| ledger_transaction_id | Bigint | 建立或刪除資料列版本的交易識別碼。 |
| 帳本_序號 | Bigint | 該資料表上的交易中資料列層級作業的順序編號。 |
| 帳本作業類型 | Tinyint | 包含 1 (INSERT) 或 2 (DELETE)。 在分類帳資料表中插入資料列時,會在分類帳檢視中產生新的資料列,而此資料行會包含 1。 從分類帳資料表刪除資料列時,會在分類帳檢視中產生新的資料列,而此資料行會包含 2。 在總帳資料表中更新資料列時,會在總帳檢視中產生兩列新的資料列。 在此欄中,一列包含 2(DELETE),另一列包含 1(INSERT)。 |
| ledger_operation_type_desc | nvarchar(128) | 包含 INSERT 或 DELETE。 如需詳細資訊,請參閱前一資料列。 |