启用变更数据捕获

本主题说明了如何对数据库和表启用变更数据捕获。

对数据库启用变更数据捕获

在为各个表创建捕获实例之前,必须先由 sysadmin 固定服务器角色的成员对数据库启用变更数据捕获。通过在数据库上下文中运行 sys.sp_cdc_enable_db (Transact-SQL) 存储过程可实现这一点。若要确定数据库是否已启用此功能,请在 sys.databases 目录视图中查询 is_cdc_enabled 列。

当对数据库启用了变更数据捕获之后,将为数据库创建 cdc 架构、cdc 用户、元数据表和其他系统对象。cdc 架构包含变更数据捕获元数据表,当对源表启用了变更数据捕获之后,各个更改表将用作更改数据的存储库。cdc 架构还包含用于查询更改数据的关联系统函数。

变更数据捕获要求采用独占方式使用 cdc 架构和 cdc 用户。如果某数据库中当前存在名为 cdc 的架构或数据库用户,那么在删除或重命名此架构或用户之前,不能对此数据库启用变更数据捕获。

有关启用数据库的示例,请参阅“为捕获数据更改启用数据库”模板。

重要说明重要提示

若要在 SQL Server Management Studio 中找到模板,请转至“视图”,单击“模板资源管理器”,然后选择“SQL Server 模板”Change Data Capture 为一个子文件夹。在此文件夹下,您会找到本主题中提到的所有模板。SQL Server Management Studio 工具栏上还有一个“模板资源管理器”图标。

-- ================================

--“Enable Database for CDC”模板

-- ================================

USE MyDB
GO

EXEC sys.sp_cdc_enable_db
GO

对表启用变更数据捕获

在对数据库启用变更数据捕获之后,db_owner 固定数据库角色的成员即可以使用存储过程 sys.sp_cdc_enable_table 为各个源表创建捕获实例。若要确定是否已对某个源表启用了变更数据捕获,请在 sys.tables 目录视图中检查 is_tracked_by_cdc 列。

创建捕获实例时,可以指定以下选项:

源表中要捕获的列。

默认情况下,源表中的所有列都将标识为已捕获列。如果只需要跟踪这些列中的部分列(如出于保密或性能方面的原因),请使用 @captured\_column\_list 参数指定这些列中要跟踪的部分列。

A filegroup to contain the change table.

默认情况下,更改表位于数据库的默认文件组中。希望控制各个更改表放置位置的数据库所有者可以使用 @filegroup\_name 参数为与该捕获实例相关的更改表指定一个特定的文件组。指定的文件组必须已存在。通常建议将更改表置于独立于源表的文件组中。有关演示如何使用 @filegroup\_name 参数的示例,请参阅Enable a Table Specifying Filegroup Option模板。

===================================================

--“Enable a Table Specifying Filegroup Option”模板

-- ===================================================

USE MyDB
GO

EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name   = N'MyTable',
@role_name     = N'MyRole',
@filegroup_name = N'MyDB_CT',
@supports_net_changes = 1
GO

A role for controlling access to a change table.

指定角色的目的是控制对更改数据的访问。指定的角色可以为现有的固定服务器角色或数据库角色。如果指定的角色还不存在,则会自动创建具有该名称的数据库角色。sysadmin 或 db_owner 角色的成员对于更改表中的数据拥有完全访问权限。所有其他用户必须对源表中的所有捕获列拥有 SELECT 权限。此外,当指定角色时,不是 sysadmin 或 db_owner 角色成员的用户还必须是指定角色的成员。

如果不想使用访问控制角色,则必须将 @role\_name 参数显式设置为 NULL。有关在不使用访问控制角色的情况下启用表的示例,请参阅Enable a Table Without Using a Gating Role模板。

-- ===================================================

--“Enable a Table Without Using a Gating Role”模板

-- ===================================================

USE MyDB
GO

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

A function to query for net changes.

捕获实例将始终包含一个表值函数以返回在指定的时间间隔内出现的所有更改表项。此函数通过在“cdc.fn_cdc_get_all_changes_”后追加捕获实例名称来命名。有关详细信息,请参阅 cdc.fn_cdc_get_all_changes_<捕获实例> (Transact-SQL)

如果将参数 @supports\_net\_changes 设为 1,还将为捕获实例生成一个净更改函数。对于在调用中指定的时间间隔内发生更改的每个非重复行,此函数仅返回一项更改。有关详细信息,请参阅 cdc.fn_cdc_get_net_changes_<capture_instance> (Transact-SQL)

若要支持净更改查询,源表必须具有用于唯一标识行的主键或唯一索引。如果使用了唯一索引,则必须使用 @index\_name 参数指定索引名称。在主键或唯一索引中定义的列必须包含在要捕获的源列列表中。

有关演示如何使用这两个查询函数创建捕获实例的示例,请参阅Enable a Table for All and Net Changes Queries模板。

=======================================================

--“Enable a Table for All and Net Changes Queries”模板

-- =======================================================

USE MyDB
GO

EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name   = N'MyTable',
@role_name     = N'MyRole',
@supports_net_changes = 1
GO
注意注意

如果对具有现有主键的表启用变更数据捕获,且未使用 @index_name 参数来标识备用的唯一索引,则变更数据捕获功能将使用主键。只有先对表禁用变更数据捕获,才能对主键进行后续更改。无论配置变更数据捕获时是否要求支持净更改查询均是如此。如果对表启用变更数据捕获时该表中没有主键,则变更数据捕获将忽略后来添加的主键。由于变更数据捕获不会使用在启用表之后创建的主键,因此可以不受限制地将该键及键列删除。