场景:
昨天发布了Oracle CDC的使用教程,有一位朋友留言“sql server cdc”是否可以,答案是肯定的。
废话少说,开干,今天咱们一起来学习Sqlserver cdc。
1、安装sqlserver数据库
本教程使用 docker 安装sqlserver,命令如下:
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Sa@123456" -p 1433:1433 --name sqlserver -d mcr.microsoft.com/mssql/server:2019-latest
2、启用数据库级别的 CDC
创建数据库和数据表,这里数据库名称为kettle,表名为t1。
1)首先要在目标数据库中启用 CDC 功能,使用如下 SQL 语句:
EXEC sys.sp_cdc_enable_db;
2)检查数据库是否已启用 CDC
SELECT name, is_cdc_enabled FROM sys.databases WHERE name = 'kettle';
3、启用表级别的 CDC
启用表级别CDC,脚本如下:
EXEC sys.sp_cdc_enable_table @source_schema = 'kettle', @source_name = 't1', @role_name = NULL, @supports_net_changes = 1;
下面报错是因为第一次创建的t1表没有主键,我们把主键加上去就行了。
建表语句如下:
CREATE TABLE t1 (id INT PRIMARY KEY,name VARCHAR(50) NOT NULL,dt DATETIME);
重新开启表级别CDC
检查表是否已启用 CDC
SELECT name, is_tracked_by_cdc FROM sys.tables WHERE name = 't1' AND schema_id = SCHEMA_ID('dbo');
4、启动CDC 捕获作业
1)CDC 捕获作业未运行:要确保 CDC 捕获作业正在运行。检查 CDC 捕获作业状态,脚本如下:
EXEC msdb.dbo.sp_help_job @job_name = 'cdc.kettle_capture';

2)使用作业名称启动作业
EXEC msdb.dbo.sp_start_job @job_name = 'cdc.kettle_capture';
5、设计转换
1)Sqlserver CDC ,监听Sqlserver日志变更,捕获数据
2)Json input,解析Sqlserver变更数据
3)Swtich/case,根据op字段进行路由
4)日志步骤,打印接收到的数据

5)Sqlserver CDC 配置
更多属性配置参考Debezium官网
6、调试
1)T1表中插入数据,脚本如下:
INSERT into t1(id,name,dt)values(1,'Java小金刚','2025-09-04 19:00:00')
kettle中可以正常接收到插入数据,如下图所示:
2)更新数据,脚本如下:
update t1 set name='无敌小金刚' where id=1
kettle中可以正常接收到更新数据,如下图所示:
3)删除数据,脚本如下:
delete from t1 where id=1;
kettle中可以正常接收到删除数据,如下所示: