启用和禁用“变更数据捕获”

适用于:SQL ServerAzure SQL 托管实例

本文介绍如何为 SQL Server 和 Azure SQL 托管实例中的数据库和表启用和禁用变更数据捕获 (CDC)。 有关 Azure SQL 数据库,请参阅 CDC 与 Azure SQL 数据库

权限

需要具有 sysadmin 权限才能为 SQL Server 和 Azure SQL 托管实例启用或禁用变更数据捕获。

为某个数据库禁用

你必须先为数据库启用变更数据捕获,然后才能为各个表创建捕获实例。

要启用变更数据捕获,请在数据库上下文中运行存储过程 sys.sp_cdc_enable_db (Transact-SQL)。 要确定数据库是否已启用 CDC,请在 sys.databases 目录视图中查询 is_cdc_enabled 列。

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

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

-- ====
-- Enable Database for CDC
-- ====
USE MyDB
GO
EXEC sys.sp_cdc_enable_db
GO

注意

要在 SQL Server Management Studio 中找到与 CDC 相关的模板,请转至“视图”,选择“模板资源管理器”,然后选择“SQL Server 模板”变更数据捕获是包含模板的子文件夹

为某个数据库禁用

在数据库上下文中使用 sys.sp_cdc_disable_db (Transact-SQL) 来禁用数据库的变更数据捕获。 在为数据库禁用 CDC 之前不必为各个表禁用 CDC。 为数据库禁用 CDC 会删除所有关联的变更数据捕获元数据,包括 cdc 用户、架构和变更数据捕获作业。 但是,任何由 CDC 创建的访问控制角色不会被自动删除,而是必须将其显式删除。 要确定数据库是否已启用 CDC,请在 sys.databases 目录视图中查询 is_cdc_enabled 列。

当删除启用了 CDC 的数据库时会自动删除变更数据捕获作业。

-- Disable Database for change data capture
USE MyDB
GO
EXEC sys.sp_cdc_disable_db
GO

为表启用

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

重要

有关 sys.sp_cdc_enable_table 存储过程参数的详细信息,请参阅 sys.sp_cdc_enable_table (Transact-SQL)

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

Columns in the source table to be captured

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

包含更改表的文件组。

默认情况下,更改表位于数据库的默认文件组中。 希望控制各个更改表放置位置的数据库所有者可以使用 @filegroup_name 参数为与该捕获实例相关的更改表指定一个特定的文件组。 指定的文件组必须已存在。 通常建议将更改表置于独立于源表的文件组中。 有关演示 @filegroup_name 参数使用方法的示例,请参阅 通过指定文件组选项启用表 模板。

-- Enable CDC for a table specifying filegroup
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

控制对更改表的访问的角色。

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

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

-- Enable CDC for a table using a gating role option
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

查询净更改的函数。

捕获实例将始终包含一个表值函数 (TVF) 以返回在指定的时间间隔内出现的所有更改表项。 此函数通过在“cdc.fn_cdc_get_all_changes_”后追加捕获实例名称来命名。 有关详细信息,请参阅 cdc.fn_cdc_get_all_changes_<capture_instance> (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 CDC for 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 参数来标识备用的唯一索引,则变更数据捕获功能将使用主键。 只有先对表禁用变更数据捕获,才能对主键进行后续更改。 无论配置变更数据捕获时是否要求支持净更改查询均是如此。 如果对表启用变更数据捕获时该表中没有主键,则变更数据捕获将忽略后来添加的主键。 由于变更数据捕获不会使用在启用表之后创建的主键,因此可以不受限制地将该键及键列删除。

为表禁用

db_owner 固定数据库角色的成员可以通过使用存储过程 sys.sp_cdc_disable_tablee. To determine whether a source table is currently enabled for change data capture, examine the **is_tracked_by_cdc** column in the sys.tables` 为各个源表删除捕获实例。 如果在禁用发生后没有对数据库启用任何表,则还会删除变更数据捕获作业。

如果删除了启用变更数据捕获的表,则会自动删除与该表关联的变更数据捕获元数据。

有关禁用表的示例,请参阅 Disable a Capture Instance for a Table 模板。

-- Disable a Capture Instance for a table
USE MyDB
GO
    EXEC sys.sp_cdc_disable_table
    @source_schema = N'dbo',
    @source_name   = N'MyTable',
    @capture_instance = N'dbo_MyTable'
GO

另请参阅