创建和使用仅追加账本表

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

本文介绍如何创建仅追加账本表。 随后,你可在仅追加账本表中插入值,然后尝试对数据进行更新。 最后,可使用账本视图查看结果。 我们将以设施的卡密钥访问系统为例,这是一种仅追加系统模式。 我们的示例将让你实际了解仅追加账本表及其对应的账本视图之间的关系。

有关详细信息,请参阅仅追加账本表

先决条件

创建仅追加账本表

我们将创建具有以下架构的 KeyCardEvents 表。

列名称 数据类型 描述
EmployeeID int 访问建筑物的员工的唯一 ID
AccessOperationDescription nvarchar (MAX) 员工的访问操作
时间戳 datetime2 员工访问建筑物的日期和时间
  1. 使用 SQL Server Management StudioAzure Data 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));
    
  2. 使用以下值将新建筑物访问事件添加到 [AccessControl].[KeyCardEvents] 表中。

    INSERT INTO [AccessControl].[KeyCardEvents]
    VALUES ('43869', 'Building42', '2020-05-02T19:58:47.1234567');
    
  3. 查看 KeyCardEvents 表的内容,并指定添加到仅追加账本表GENERATED ALWAYS 列。

    SELECT *
         ,[ledger_start_transaction_id]
         ,[ledger_start_sequence_number]
    FROM [AccessControl].[KeyCardEvents];
    

    Screenshot that shows results from querying the KeyCardEvents table.

  4. 查看 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;
    
  5. 尝试通过将 EmployeeID43869 更改为 34184. 来更新 KeyCardEvents

    UPDATE [AccessControl].[KeyCardEvents] SET [EmployeeID] = 34184;
    

    你将收到一条错误消息,其中指出不允许对仅追加账本表进行更新。

    Screenshot that shows the append-only error message.

权限

创建仅追加账本表需要ENABLE LEDGER 权限。 有关与账本表相关的权限的详细信息,请参阅权限