仅追加账本表

适用于: SQL Server 2022 (16.x) Azure SQL 数据库Azure SQL 托管实例

仅追加账本表只允许对表执行 INSERT 操作,确保数据库管理员等特权用户无法通过传统的数据操作语言操作更改数据。 仅追加账本表非常适合不会更新或删除记录的系统(例如安全信息事件和管理系统),或需要将数据从区块链复制到数据库的区块链系统。 由于不能对仅追加表执行 UPDATEDELETE 操作,因此不需要像对可更新账本表那样提供相应的历史记录表。

Diagram that shows architecture of ledger tables.

可以通过在 CREATE TABLE (Transact-SQL) 语句中指定 LEDGER = ON 参数并指定 APPEND_ONLY = ON 选项来创建仅追加账本表。

重要

创建账本表形式的表后,无法将该表还原为没有账本功能的表。 因此,攻击者无法临时删除账本功能,对表进行更改,然后重新启用账本功能。

仅追加账本表的架构

仅追加表需要具有以下 GENERATED ALWAYS 列,这些列包含元数据,说明哪些事务对表进行了更改,以及事务更新行的操作顺序。 创建仅追加账本表时,将在账本表中创建 GENERATED ALWAYS 列。 此数据可用于取证目的,了解在一段时间内插入数据的方式。

如果未在 CREATE TABLE 语句中指定 GENERATED ALWAYS 列的定义,系统将使用以下默认名称自动添加这些定义。

默认列名称 数据类型 描述
ledger_start_transaction_id bigint 创建行版本的事务 ID
ledger_start_sequence_number bigint 创建行版本的事务中的操作序列号

账本视图

对于每个仅追加账本表,系统会自动生成一个称为“账本视图”的视图。 账本视图报告表中发生的所有行插入。 账本视图主要对可更新账本表(而不是仅追加账本表)有用,因为仅追加账本表没有任何 UPDATEDELETE 功能。 仅追加账本表的账本视图可用于实现可更新账本表和仅追加账本表之间的一致性。

账本视图架构

注意

创建表时,可以将 <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)。 不应对仅追加账本表执行 DELETE。
ledger_operation_type_desc nvarchar(128) 包含 INSERTDELETE。 有关详细信息,请参阅上一行。