因为公司的产品跟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 = N'dbo',
@source_name = N'Btype',
@role_name = NULL
GO
-- 禁用表的CDC
USE myDb
GO
EXEC sys.sp_cdc_disable_table
@source_schema = N'dbo',
@source_name = N'ptype',
@capture_instance = N'dbo_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');