本主题介绍如何为数据库和表启用和禁用更改数据捕获。
为数据库启用变更数据捕获
在为单个表创建捕获实例之前,sysadmin
固定服务器角色的某个成员必须先启用数据库的更改数据捕获。 这是通过在数据库上下文中运行存储过程 sys.sp_cdc_enable_db(Transact-SQL) 来完成的。 若要确定数据库是否已启用此功能,请在 is_cdc_enabled
目录视图中查询 sys.databases
列。
为更改数据捕获启用数据库时, cdc
将为数据库创建架构、 cdc
用户、元数据表和其他系统对象。 架构 cdc
包含变更数据捕获元数据表,在为更改数据捕获启用源表后,单个更改表充当更改数据的存储库。 该 cdc
架构还包含用于查询更改数据的关联系统函数。
更改数据捕获需要独占使用 cdc
架构和 cdc
用户。 如果数据库中当前存在名为 cdc 的架构或数据库用户,则在删除或重命名架构或用户之前,无法为更改数据捕获启用数据库。
有关启用数据库以进行变更数据捕获的示例,请参阅“启用数据库变更数据捕获模板”。
重要
若要在 SQL Server Management Studio 中找到模板,请转到 “查看”,单击 “模板资源管理器”,然后选择 “SQL Server 模板”。 数据变化捕获 是一个子文件夹。 在此文件夹下,你将找到本主题中引用的所有模板。 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
列。
当删除启用了变更数据捕获的数据库时会自动删除变更数据捕获作业。
请参阅“禁用变更数据捕获功能的数据库”模板以获取禁用数据库的示例。
重要
若要在 SQL Server Management Studio 中找到模板,请转到 “查看”,单击 “模板资源管理器”,然后单击“ SQL Server 模板”。 更改数据捕获 是一个子文件夹,可在其中找到本主题中引用的所有模板。 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
为单个源表创建捕获实例。 若要确定是否已为更改数据捕获启用源表,请检查目录视图中的is_tracked_by_cdc列 sys.tables
。
创建捕获实例时可以指定以下选项:
Columns in the source table to be captured
。
默认情况下,源表中的所有列都将标识为已捕获列。 如果只需要跟踪列的子集(例如出于隐私或性能原因),请使用 @captured_column_list 参数来指定列的子集。
A filegroup to contain the change table.
默认情况下,更改表位于数据库的默认文件组中。 希望控制各个更改表放置位置的数据库所有者可以使用 @filegroup_name 参数为与该捕获实例相关的更改表指定一个特定的文件组。 指定的文件组必须已存在。 通常,建议将更改表放置在独立于源表的文件组中。 请参阅Enable a Table Specifying Filegroup Option
模板,了解有关@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
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 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
A function to query for net changes.
捕获实例将始终包含一个表值函数,用于返回在定义间隔内发生的所有更改表条目。 通过将捕获实例名称追加到“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
删除单个源表的捕获实例。 若要确定源表当前是否已启用更改数据捕获,请检查目录视图中的is_tracked_by_cdc
sys.tables
列。 如果在禁用过程完成后没有为数据库启用任何表,更改数据捕获作业也将被移除。
如果删除了启用变更数据捕获的表,则会自动删除与该表关联的变更数据捕获元数据。
有关禁用表的示例,请参阅“禁用表捕获实例模板”。
-- =====
-- 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)