SQL Server 变更数据捕获 (Change Data Capture)

SQL Server 变更数据捕获,简称 CDC,捕获对表所做的更改。例如,如果您想存储有关 UPDATE、INSERT 和 DELETE 操作的审计信息,请在该表上启用 CDC。

本章将通过一个示例解释如何启用 CDC、禁用 CDC 以及在单个列上启用 CDC。对于此 SQL Server 变更数据捕获演示,我们将使用 CDC 测试数据。从下面的屏幕截图可以看出,它只有一个表,即 Employee。

View table Information in Object Explorer 1

下面的屏幕截图将显示 Employee 表中的数据。

执行 SQL Server 变更数据捕获 (CDC)

实施 CDC 或变更数据捕获是一个两步法。首先,您必须在数据库上启用 CDC,然后才能在表上启用 CDC。

在数据库上实施 CDC

下面的代码片段将在数据库级别启用 CDC。

USE [CDC Testing]
GO
EXEC sys.sp_cdc_enable_db
Messages
--------
Command(s) completed successfully.

如果您观察下面的屏幕截图,启用 SQL Server 变更数据捕获会自动在系统表中创建六个 CDC 表。

Implement on Database Table4

以及一些系统存储过程,用于在服务器中实现变更数据捕获。

SQL Server Change Data Capture CDC System stored Procedures 5

在表上实施 CDC

下面的 CDC 代码片段将在表级别启用 SQL 变更数据捕获。这里指的是 Employee 表。

EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo', -- Schema Name. Example, HR, Sales etc
@source_name = N'Employee', -- Table Name
@role_name = NULL -- Any specified roles
GO
Messages
-------
Job 'cdc.CDC Testing_capture' started successfully.
Job 'cdc.CDC Testing_cleanup' started successfully.

从上面的屏幕截图可以看出,我们已成功在 Employee 表上实现了变更数据捕获。

假设您进入数据库。在系统表下,您将找到新表 cdc.dbo.Employee_CT(在您的情况下,Employee 将替换为表名)。

此表将存储审计信息(或捕获表更改)。

SQL Server Change Data Capture CDC Audit Information Table 7

让我使用 INSERT 语句向表中插入新行。

INSERT INTO [dbo].[Employee] (
	[FirstName], [LastName], [Occupation], [YearlyIncome])
VALUES ('Tutorial', 'Gateway', 'Admin', 10000)
Messages
-------
(1 row(s) affected)

如果您检查 dbo_Employee_CT 表,您可以看到记录的操作号为 2(插入)。

CDC record information 9

接下来,我们将使用 UPDATE 语句执行更新

UPDATE [dbo].[Employee]
    SET [FirstName] = 'Dave'
    WHERE [EmpID] = 3
Messages
-------
(1 row(s) affected)

让我向您展示 Employee 表

Records inside Normal Employee Table 11

如果您检查 dbo_Employee_CT 表,您可以看到操作号为 3 的旧记录(更新前的值)和操作号为 4 的新记录(已更新)。

Change Data Capture 12

最后,我们将使用 DELETE 语句执行删除操作

DELETE FROM [dbo].[Employee]
	WHERE [EmpID] = 4
Messages
-------
(1 row(s) affected)

您可以从下面的屏幕截图中看到,没有 Emp Id 为 4 的记录。

Deleting record from enabled table 14

如果您检查 dbo_Employee_CT 表,您可以看到操作号为 1 的已删除记录(已删除)。

Change Data Capture 15

禁用 SQL Server 变更数据捕获 (CDC)

您必须遵循相同的步骤来禁用变更数据捕获 CDC。

在表上禁用 CDC

如果您知道捕获实例 (Schema.table_name),请跳过此步骤并应用下一个代码。下面的存储过程将提供有关 CDC 变更数据捕获的信息。

EXEC sys.sp_cdc_help_change_data_capture 
GO
Change Data Capture 17

下面的代码片段将禁用数据库级别的变更数据捕获。我们需要该 capture_instance 来禁用它。

EXEC sys.sp_cdc_disable_table
@source_schema = N'dbo',
@source_name = N'Employee',
@capture_instance = dbo_Employee
GO
Messages
-------
Command(s) completed successfully.

禁用数据库上的变更数据捕获

在表级别禁用 CDC 后,您必须在数据库级别禁用变更数据捕获。下面的代码将执行相同的操作。

EXEC sys.sp_cdc_disable_db
Messages
-------
Command(s) completed successfully.

现在您可以看到所有系统生成的(CDC 生成的系统表)都已消失。

Removes generated system tables 20

在多个列上启用 CDC

SQL Server 允许您在单个列上启用 CDC,而不是在整个表上启用变更数据捕获。在此示例中,我们将在 Emp ID 和 First Name 列上启用 CDC。

EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'Employee',
@role_name = NULL,
@captured_column_list = '[EmpID], [FirstName]'
GO
Messages
-------
Job 'cdc.CDC Testing_capture' started successfully.
Job 'cdc.CDC Testing_cleanup' started successfully.

让我向员工表插入一条新记录。

INSERT INTO [dbo].[Employee] (
	[FirstName], [LastName], [Occupation], [YearlyIncome])
VALUES ('SQL', 'Server', 'Tutorial', 20000)
Messages
--------
(1 row(s) affected)

从下面的屏幕截图可以看出,我们为名字、姓氏、职业和年收入插入了一条新记录。但是,它只捕获有关 Emp Id 和名字的信息。

Change Data Capture 23

在结束本文之前,让我向您展示 Captured_Columns 中的数据。正如您所见,它存储了变更数据捕获捕获的所有列。

Change Data Capture CDC 16