65.9K
CodeProject 正在变化。 阅读更多。
Home

CDC - 更改数据捕获

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.67/5 (2投票s)

Sep 13, 2009

CPOL

3分钟阅读

viewsIcon

28915

downloadIcon

193

审计 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。如果表已存在,请在创建它之前删除它。这只是一个示例表,但对于任何其他表或多个表,该序列都将是相同的。

现在它应该看起来像这样

SQL Server with DB

下一步是在 CDC 中创建审计。

EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name   = N'MinUser',
@role_name     = NULL,
@supports_net_changes = 1
GO

要检查此过程完成了什么,请检查您刚创建的数据库下的系统表。您应该看到类似如下所示的内容。应该有一个表,其模式名称、源名称和 _CT,以描述该表用于更改。

with audits enabled

在执行此操作之前要检查的一件事是确保 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 操作,看看每个表中有什么内容。

with audits enabled - Click to enlarge image
Update [MinUser] set User_Currency = 3 where _
	User_Id = '1DC422DB-7A82-410c-9465-98BBB692D1C8'

现在再次对每个表执行一个 select 操作,看看每个表中有什么内容,并查看发生了什么变化。

with audits enabled - Click to enlarge image

该表显示了在主表上发生的操作以及主记录的数据。操作列显示了对数据执行的操作。这些操作被列为

  • 1 = delete (删除)
  • 2 = insert (插入)
  • 3 = update (捕获的列值是 update 操作之前的值)。此值仅在指定了行筛选器选项“all update old”时适用
  • 4 = update (捕获的列值是 update 操作之后的值)

因此,正如您所看到的,第一次我们的操作是 2,它告诉我们发生了 insert。第二张图片显示我们有 3(操作之前)和 4(操作之后)。还有许多其他的 CDC 操作可以使用。下面是一个附加存储过程的简要列表

Additional CDC

关注点

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

历史

  • 2009年9月12日 - 初始发布
© . All rights reserved.