CDC - 更改数据捕获
审计 SQL 的插入、更新和删除操作
引言
在之前的文章中,我写了关于 Postgres 和审计的内容。审计是企业应用程序的重要组成部分。我尽量阅读尽可能多的关于企业应用程序的文章。当我看到一项新技术时,我想看看它如何融入这些类型的应用程序。我开始阅读 CDC 并决定写这篇文章。
使用该技术
首先,我创建了一个数据库,我们可以用它来测试该功能。
CREATE Database MinAudit
GO
USE MinAudit
GO
/*
/ Enable CDC
*/
EXEC sys.sp_cdc_enable_db
GO
IF OBJECT_ID('MinUser') IS NOT NULL
DROP TABLE MinUser
GO
/*
/ The main data table
*/
CREATE TABLE MinUser (
User_Id UNIQUEIDENTIFIER not NULL PRIMARY KEY,
Mod_User varchar (50) NOT NULL,
User_Currency int not null,
User_Name varchar (50) NOT NULL,
User_Password varchar (50) NOT NULL,
UNIQUE (User_Name)
)
创建数据库后,您应该启用 CDC。如果表已存在,请在创建它之前删除它。这只是一个示例表,但对于任何其他表或多个表,该序列都将是相同的。
现在它应该看起来像这样

下一步是在 CDC 中创建审计。
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'MinUser',
@role_name = NULL,
@supports_net_changes = 1
GO
要检查此过程完成了什么,请检查您刚创建的数据库下的系统表。您应该看到类似如下所示的内容。应该有一个表,其模式名称、源名称和 _CT,以描述该表用于更改。

在执行此操作之前要检查的一件事是确保 SQL 代理正在运行。CDC 使用它来执行更改。如果您忘记了,您将收到一个错误。有一次,我忘记了,我收到了以下错误,但我删除了该表并重新运行了 SQL。
SQLServerAgent is not currently running so it cannot be notified of this action.
下一步是检查审计并查看它们的作用。首先,让我们执行一个 insert
操作,看看会发生什么,然后执行一个 update
操作。
INSERT INTO [MinUser](User_Id, Mod_User, User_Currency, User_Name, User_Password)
VALUES ('1DC422DB-7A82-410c-9465-98BBB692D1C8', 'hazel', 2, 'don', 'password')
现在对每个表执行一个 select
操作,看看每个表中有什么内容。

Update [MinUser] set User_Currency = 3 where _
User_Id = '1DC422DB-7A82-410c-9465-98BBB692D1C8'
现在再次对每个表执行一个 select
操作,看看每个表中有什么内容,并查看发生了什么变化。

该表显示了在主表上发生的操作以及主记录的数据。操作列显示了对数据执行的操作。这些操作被列为
- 1 =
delete
(删除) - 2 =
insert
(插入) - 3 =
update
(捕获的列值是update
操作之前的值)。此值仅在指定了行筛选器选项“all update old”时适用 - 4 =
update
(捕获的列值是update
操作之后的值)
因此,正如您所看到的,第一次我们的操作是 2,它告诉我们发生了 insert
。第二张图片显示我们有 3(操作之前)和 4(操作之后)。还有许多其他的 CDC 操作可以使用。下面是一个附加存储过程的简要列表

关注点
这是对 CDC 的简要介绍。我想要尝试它的主要原因是了解它的功能。我想看看这是否有助于我们进行审计。在撰写本文时,CDC 功能仅在 MSSQL 的企业版和开发人员版中可用,我对此感到失望。CDC 功能有很多好处,它不仅擅长进行审计,微软还为此制定了额外的计划,其中之一是 Sync。Sync 可用于同步两个断开连接的数据库。它使用 CDC 来跟踪已发生的更改来实现这一点。我希望您喜欢这次介绍并有兴趣了解更多信息。采用的主要问题将是它仅在企业版和开发人员版中可用。
历史
- 2009年9月12日 - 初始发布