您可能听说或看到,从安全角度来看,SQL Server的下一个版本:SQL Server 2022具有一个名为Ledger的功能。
它已经在Azure中使用,但什么是账本?
在2点中,我会说:
-
分类账有助于简化审计,为审计师提供数据完整性的加密证明。
-
账本还可以保护数据免受任何攻击者或高权限用户(包括数据库或系统管理员)的攻击。
微软为我们提供了一个很好的模式来解释我是如何工作的:

如果在表中进行了任何更改(删除、更新),则历史记录表中会出现先例值。
这就像一张临时表格,不是吗?
原则上是的,但其实不是,因为它也受到保护,而且更深入。
使用的技术是区块链。每个记录都将被加密,并具有前一个加密块和时间戳。
我在这个博客上,我只想解释一下它在没有加密端的情况下是如何工作的。
让我们开始我们的第一步…
我们可以使用LEDGER=ON选项直接创建数据库
例如:

CREATE DATABASE [test_ledger]
ON PRIMARY
( NAME = N'test_ledger', FILENAME = N'D:\DATA\test_ledger.mdf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
LOG ON
( NAME = N'test_ledger_log', FILENAME = N'L:\LOG\test_ledger_log.ldf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
With LEDGER = ON
GO
使用sys可以很容易地看到。数据库,如果使用列名is_ledger_on启用或不启用:
select name, is_ledger_on from sys.databases
我也尝试做一个alter数据库来禁用它,但它不起作用,我会说“还没有”…

之后,我使用时态表的语法创建了一个表,并添加了分类账语法:

CREATE TABLE [test_table_ledger]
(
Id int not null primary key clustered,
test1 varchar(10) NOT NULL,
test2 varchar(10) NOT NULL
)
WITH
(
SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.test_table_ledger_hist),
LEDGER = ON
)
正如您在新的SSMS中所看到的,该表被标记为可更新的分类账,并且您有一个关联的历史表

如果我看一下这两张表,它们是空的:

我插入5个值,以便在表中有一些行:

如果这些插入没有更改,则历史记录表在逻辑上为空。
现在,我将对第一行进行简单更新:

如您所见,history表具有旧值,my表使用新值更新
Microsoft建议对历史表使用分类账视图,而不是直接使用历史表。

3视图是可能的。第一个是sys。database_ledger_transactions,我将在本博客中只讨论这一个
此视图为我们提供了数据库事务的历史记录:

没有很好的摘要可读,但如果我看一看,就会通过分类账创建一个新视图,名称为我的table+_Ledger。
在这种情况下,您可以很容易地看到操作类型

将最后一个视图与sys组合。database_ledger_transactions,您可以跟踪操作。
在我的例子中,5次插入和1次更新(插入+删除)

select dlt.commit_time, dlt.principal_name, test.id,test.test1, test.test2, test.ledger_operation_type_desc
from test_table_ledger_Ledger test join sys.database_ledger_transactions dlt on test.ledger_transaction_id = dlt.transaction_id
这个新特性的另一个有趣部分是将数据从普通表复制到分类账表的存储过程:sp_copy_data_in_batches
但这将是另一个故事…
希望能激起你的好奇心!
原文标题:SQL Server 2022 security: Do you know Ledger?
原文作者:Stéphane Haby
原文链接:https://www.dbi-services.com/blog/sql-server-2022-security-do-you-know-ledger/




