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

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

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

为某个数据库禁用

sysadmin 固定服务器角色(仅在 SQL Server / Azure SQL 托管实例中)或 db_owner 的成员需要先为数据库启用“更改数据捕获”,才能为单个表创建捕获实例。 这是通过在数据库上下文 中sys.sp_cdc_enable_db (Transact-SQL) 运行存储过程来完成的。 若要确定数据库是否已启用此项功能,请在 sys.databases 目录视图中查询 is_cdc_enabled 列。

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

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

有关启用数据库的示例,请参阅 Enable Database for Change Data Capture 模板。

重要

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

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

为某个数据库禁用

sysadmin 固定服务器角色的成员可以在数据库上下文中sys.sp_cdc_disable_db (Transact-SQL) 运行存储过程,以禁用数据库的变更数据捕获。 在禁用数据库之前不必禁用各个表。 禁用数据库会删除所有关联的变更数据捕获元数据,包括 cdc 用户、架构和变更数据捕获作业。 但是,任何由变更数据捕获创建的访问控制角色不会被自动删除,而是必须将其显式删除。 若要确定数据库是否已启用此项功能,请在 sys.databases 目录视图中查询 is_cdc_enabled 列。

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

有关禁用数据库的示例,请参阅 Disable Database for Change Data Capture 模板。

重要

若要在 SQL Server Management Studio中找到模板,请转至 “视图”,单击 “模板资源管理器”,然后单击 “SQL Server 模板”。 “change data capture”是子文件夹,该文件夹中包含本主题中引用的所有模板。 工具栏上还有一个 “模板资源管理器” SQL Server Management Studio 图标。

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

为表启用

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

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

要在源表中捕获的列

默认情况下,源表中的所有列都将标识为已捕获列。 如果只需要跟踪列的子集(例如出于隐私或性能原因),请使用 @captured_column_list 参数指定列的子集。

包含更改表的文件组。

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

-- =========  
-- Enable a Table Specifying Filegroup Option Template  
-- =========  
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  

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

指定角色的目的是控制对更改数据的访问。 指定的角色可以为现有的固定服务器角色或数据库角色。 如果指定的角色还不存在,则会自动创建具有该名称的数据库角色。 Sysadmin(仅在 SQL Server / Azure SQL 托管实例中)或 db_owner 角色的成员对“更改”表中的数据均具有完全访问权限。 所有其他用户必须对源表中的所有捕获列拥有 SELECT 权限。 此外,当指定角色时,不是 sysadmindb_owner 角色成员的用户还必须是指定角色的成员。

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

-- =========  
-- Enable a Table Without Using a Gating Role template   
-- =========  
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  
  

查询净更改的函数。

捕获实例将始终包含一个表值函数以返回在指定的时间间隔内出现的所有更改表项。 此函数通过在“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 a Table for All and Net Changes Queries template   
-- =============  
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为各个源表删除捕获实例。 若要确定是否已对某个源表当前启用了变更数据捕获,请在 sys.tables 目录视图中检查 is_tracked_by_cdc 列。 如果在禁用发生后没有对数据库启用任何表,则还会删除变更数据捕获作业。

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

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

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

另请参阅

跟踪数据更改 (SQL Server)
关于变更数据捕获 (SQL Server)
处理变更数据 (SQL Server)
管理和监视变更数据捕获 (SQL Server)