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

适用于: SQL Server Azure SQL 托管实例

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

权限

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

为某个数据库禁用

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

要启用变更数据捕获,请在数据库上下文中运行存储过程 sys.sp_cdc_enable_db (Transact-SQL)。 若要确定数据库是否已启用此功能,请在 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 列。

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

-- 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_table 为各个源表移除捕获实例功能。 若要确定当前是否已对某个源表启用了变更数据捕获,请在 is_tracked_by_cdc 目录视图中检查 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

另请参阅