sqlServer数据库CDC无法开启的解决办法

因为公司的产品跟ERP对接,采用的是基于数据库CDC监控增量的方案,最近一个客户重装的ERP的数据库,导致重装完,无法开启CDC,数据库开启CDC的方法,执行以下sql:

-- 为指定的数据库库开启CDC
USE myDb
GO
EXEC sys.sp_cdc_enable_db;

查询是否开启成功的方法:

--检查指定的库是否开启CDC,结果为1表示开启了CDC,为0表示没有开启。myDb表示要查询的库名,如果要查别的库只需更改库名
SELECT is_cdc_enabled,
       CASE
           WHEN is_cdc_enabled = 0 THEN 0
           ELSE 1
           END status
FROM sys.databases
WHERE NAME = myDb;

执行了开启sql时,出现“因为当前数据库中已存在名为 cdc 的数据库用户或名为 cdc 的架构,因此无法启用数据库" XXX " 。更改数据捕获需要这些对象”的错误提示,于是就到数据库根目录-安全性下面的用户和架构两个目录下看了下,确实存在“cdc”用户和“cdc”架构两个文件,

于是我重命名了cdc用户,cdc架构无法重命名,深度删除,结果又报错:

意思是cdc架构被其它对象引用,无法删除,于是在网上搜索查询引用cdc架构的方法如下:

use myDb
go
select obj.type, obj.name
from sys.objects obj join sys.schemas s on(s.schema_id = obj.schema_id)
where s.name = cdc
order by obj.name
go

type为“IF”是function,为“P”是procedure,删除方法如下:

drop function cdc.[fn_cdc_get_all_changes_...];
drop function cdc.[fn_cdc_get_net_changes_ ... ];
drop procedure cdc.sp_upd_855595478;

把相关引用cdc架构的函数和存储过程删除后,再启用数据库的cdc功能就正常了!

下面再附上数据库表的CDC开启和禁用,以及查询表的CDC是否开启的方法:

-- 开启表的CDC
use myDb;
go
EXEC sys.sp_cdc_enable_table
     @source_schema = Ndbo,
     @source_name = NBtype,
     @role_name = NULL
GO
-- 禁用表的CDC
USE myDb
GO
EXEC sys.sp_cdc_disable_table
     @source_schema = Ndbo,
     @source_name = Nptype,
     @capture_instance = Ndbo_ptype_CT
GO

-- 查询表是否开启CDC
SELECT name,
       is_tracked_by_cdc,
       CASE
           WHEN is_tracked_by_cdc = 0 THEN CDC功能禁用
           ELSE CDC功能启用
           END 描述
FROM sys.tables
where object_id = OBJECT_ID(dbo.ptype);
经验分享 程序员 微信小程序 职场和发展