其实公司从很久之前就开始用CDC做数据同步,之前的博客也记录过使用CDC过程中遇到的问题。
无法更改列 ‘xxx’,因为它是 ‘REPLICATED’。
CDC的ct表出现违反唯一约束错误
今天打算把CDC相关知识点具体总结一下:
一.开启库级别CDC
--查询数据库是否启用CDC:1 成功; 0 失败
select name,is_cdc_enabled from sys.databases where name=db_name;
--开启库级别CDC:
EXEC sys.sp_cdc_enable_db
错误号 15517 :某个/些存储过程使用了具有WITHEXECUTE AS 的选项。使其在当前库具有了某个架构,但是当在别的地方执行时,由于没有这个架构,所以就报错
解决方法:
ALTER AUTHORIZATION ON DATABASE::[AdventureWorks] TO [sa]
--禁用数据库
EXEC sys.sp_cdc_disable_db
二.开启表级别CDC
exec sys.sp_cdc_enable_table
[ @source_schema = ] 'source_schema',--是源表所属的架构的名称
[ @source_name = ] 'source_name' ,--是对其启用变更数据捕获的源表的名称。source_name 必须存在于当前数据库中。不能对 cdc 架构中的表启用变更数据捕获。
[ @role_name = ] 'role_name'--是用于控制更改数据访问的数据库角色的名称。如果显式设置为 NULL,则没有控制角色用于限制对更改数据的访问。
[,[ @capture_instance = ] 'capture_instance' ]--是用于命名特定于实例的变更数据捕获对象的捕获实例的名称,源表最多可以有两个捕获实例
[,[ @supports_net_changes = ] 1 --将为捕获实例生成一个净更改函数。对于在调用中指定的时间间隔内发生更改的每个非重复行,此函数仅返回一项更改。若要支持净更改函数,原表必须具有主键或唯一索引。如果使用了唯一索引,则必须使用@index_name参数指定索引名称。在逐渐或唯一索引中定义的列必须包含在要捕获的源列列表中。
[,[ @index_name = ] 'index_name' ] --由于指定@supports_net_changes ,则需要指定唯一索引名称
[,[ @captured_column_list = ] 'captured_column_list' ]--标识将包括在更改表中的源表列。如果为 NULL,则所有列都将包括在更改表中。captured_column_list 是以逗号分隔的列名称列表。