适用于:SQL Server 2022 (16.x) 
Azure SQL 数据库
Azure SQL 托管实例
本文介绍如何创建仅追加账本表。 随后,你可在仅追加账本表中插入值,然后尝试对数据进行更新。 最后,可使用账本视图查看结果。 我们将以设施的卡密钥访问系统为例,这是一种仅追加系统模式。 我们的示例将让你实际了解仅追加账本表及其对应的账本视图之间的关系。
有关详细信息,请参阅仅追加账本表。
先决条件
创建仅追加账本表
我们将创建具有以下架构的 KeyCardEvents 表。
| 列名称 | 数据类型 | 描述 | 
|---|---|---|
| EmployeeID | int | 访问建筑物的员工的唯一 ID | 
| AccessOperationDescription | nvarchar (MAX) | 员工的访问操作 | 
| Timestamp | datetime2 | 员工访问建筑物的日期和时间 | 
- 使用 SQL Server Management Studio 创建新的架构和名为 - [AccessControl].[KeyCardEvents]的表。- CREATE SCHEMA [AccessControl]; GO CREATE TABLE [AccessControl].[KeyCardEvents] ( [EmployeeID] INT NOT NULL, [AccessOperationDescription] NVARCHAR (1024) NOT NULL, [Timestamp] Datetime2 NOT NULL ) WITH (LEDGER = ON (APPEND_ONLY = ON));
- 使用以下值将新建筑物访问事件添加到 - [AccessControl].[KeyCardEvents]表中。- INSERT INTO [AccessControl].[KeyCardEvents] VALUES ('43869', 'Building42', '2020-05-02T19:58:47.1234567');
- 查看 KeyCardEvents 表的内容,并指定添加到仅追加账本表的 GENERATED ALWAYS 列。 - SELECT * ,[ledger_start_transaction_id] ,[ledger_start_sequence_number] FROM [AccessControl].[KeyCardEvents];
- 查看 KeyCardEvents 账本视图的内容以及账本事务系统视图,以确定是谁向表中添加了记录。 - SELECT t.[commit_time] AS [CommitTime] , t.[principal_name] AS [UserName] , l.[EmployeeID] , l.[AccessOperationDescription] , l.[Timestamp] , l.[ledger_operation_type_desc] AS Operation FROM [AccessControl].[KeyCardEvents_Ledger] l JOIN sys.database_ledger_transactions t ON t.transaction_id = l.ledger_transaction_id ORDER BY t.commit_time DESC;
- 尝试通过将 - KeyCardEvents从- EmployeeID更改为- 43869来更新- 34184.表- UPDATE [AccessControl].[KeyCardEvents] SET [EmployeeID] = 34184;- 你将收到一条错误消息,其中指出不允许对仅追加账本表进行更新。   
权限
创建仅追加账本表需要ENABLE LEDGER 权限。 有关与账本表相关的权限的详细信息,请参阅权限。