设为首页 收藏本站
查看: 906|回复: 0

[经验分享] [一步一步] SQL Server 2008变更数据捕获

[复制链接]

尚未签到

发表于 2015-6-30 12:48:20 | 显示全部楼层 |阅读模式
  变更数据捕获
  变更数据捕获使用异步进程读取事务日志,获取DML更改实际数据做为数据捕获的结果。在捕获结果中,还包含更改相关的一些信息(例如更改的操作类型、更新操作影响的列等)。
  应用程序可以从捕获结果中获取DML更改的全部数据,而无需查询数据变更的原始表。
Step1:创建测试数据库
-- ====================================================

-- 测试的数据库



DSC0000.gif DSC0001.gif MiniMSDN.com为您提供的代码


1 USE master;
2
3 GO
4
5 CREATE DATABASE DB_test;
6
7 GO
  
-- 启用变更数据捕获



MiniMSDN.com为您提供的代码


1 USE DB_test;
2
3 EXEC sys.sp_cdc_enable_db;
4
5 GO
  
[备注说明]
  sys.sp_cdc_enable_db:
--无法对系统数据库和分发数据库启用变更数据捕获。
  --sys.sp_cdc_enable_db 将创建以全数据库为作用域的变更数据捕获对象,包括元数据表和 DDL 触发器。它还会创建 cdc 架构和 cdc 数据库用户,并将 sys.databases 目录视图中的数据库条目的 is_cdc_enabled 列设置为 1。
[附图]

DSC0002.png
Step2:检查SQL Server Agent 服务的状态,如果未启动,则启动它


MiniMSDN.com为您提供的代码


1 -- ====================================================
2
3 -- 检查SQL Server Agent 服务的状态,如果未启动,则启动它
4
5 DECLARE
6     @agnt_service sysname;
7 SET @agnt_service = N'SQLServerAgent';
8
9  
10 DECLARE @tb_agent_status TABLE(
11     state varchar(50)
12 );
13
14 INSERT @tb_agent_status
15
16 EXEC master.sys.xp_servicecontrol
17     N'QUERYSTATE',
18     @agnt_service;
19  
20 IF NOT EXISTS(
21         SELECT * FROM @tb_agent_status
22         WHERE state = N'Running.')
23     EXEC master.sys.xp_servicecontrol
24         N'START',
25         @agnt_service;
26 GO
  
Step3:创建测试表



Minimsdn.com为您提供的代码:


1 -- ====================================================
2
3 -- 测试的表
4
5 USE DB_test;
6
7 GO
8
9 CREATE TABLE dbo.tb(
10
11     id int
12
13         CONSTRAINT PK_tb_id PRIMARY KEY,
14
15     col1 int,
16
17     col2 varchar(10),
18
19     col3 nvarchar(max),
20
21     col4 varbinary(max),
22
23     col5 xml
24
25 );
26
27 GO
  
-- 创建一个变更数据捕获实例- 所有列

-- 创建数据库中的第一个变更数据捕获实例的时候,数据捕获和清理的JOB 会自动创建

-- 可以通过sys.sp_cdc_change_job 这个存储过程去调整捕获和清理的相关设置

-- 也可以在创建第一个变更数据捕获实例前,使用sys.sp_cdc_add_job去创建数据捕获和清理Job,在创建时做好相关的设置



MINIMsdn.com为您提供的代码


EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'tb',
@capture_instance = N'dbo_tb',
@role_name = NULL;
  
执行结果[附图]:


DSC0003.png
-- 创建一个变更数据捕获实例- 特定列



Minimsdn.com为您提供的代码


EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'tb',
@capture_instance = N'dbo_tb_col',
@role_name = NULL,
@captured_column_list = N'id,col1,col2';
GO
  
执行结果[附图]:

Step4:数据测试

-- ====================================================

Step4.1:数据测试  -  插入
Step4.1.1:数据测试  -  第一次插入3行数据

-- a. 插入初始数据



MiniMsdn.com为您提供的代码


1 INSERT dbo.tb(
2
3     id,
4
5     col1, col2, col3, col4, col5)
6
7 VALUES(
8
9     1,
10
11     1, 'AA', 'AAA', 0x1, 'aa'),
12
13 (
14
15     2,
16
17     2, 'BB', 'BBB', 0x2, ''),
18
19 (
20
21     3,
22
23     3, 'CC', 'CCC', 0x2, '');
  
查询并[附图]


MiniMSDN.com为您提供的代码:


1 WITH
2
3 LSN AS(
4
5     SELECT
6
7         from_lsn = sys.fn_cdc_get_min_lsn(N'dbo_tb'),
8
9         to_lsn = sys.fn_cdc_get_max_lsn()
10
11 ),
12
13 CHG_ALL AS(
14
15     SELECT
16
17         CHG.*
18
19     FROM LSN
20
21         CROSS APPLY cdc.fn_cdc_get_all_changes_dbo_tb(LSN.from_lsn, LSN.to_lsn, 'ALL UPDATE OLD') CHG
22
23 ),
24
25 CHG_NET AS(
26
27     SELECT
28
29         CHG.*
30
31     FROM LSN
32
33         CROSS APPLY cdc.fn_cdc_get_net_changes_dbo_tb(LSN.from_lsn, LSN.to_lsn, 'ALL') CHG
34
35 )
36
37 SELECT * FROM CHG_ALL;
  
DSC0004.png
Step4.1.2:数据测试  -  第二次插入3行数据



Minimsdn.com为您提供的代码:


1 INSERT dbo.tb(
2     id, col1, col2, col3, col4, col5)
3
4 VALUES
5
6     (4,4, 'DD', 'DDD', 0x4, 'dd'),
7     (5,5, 'EE', 'EEE', 0x5, ''),
8     (6,6, 'FF', 'FFF', 0x6, '');

查询并[附图]



Minimsdn.com为您提供的代码


1 WITH
2
3 LSN AS(
4
5     SELECT
6
7         from_lsn = sys.fn_cdc_get_min_lsn(N'dbo_tb'),
8
9         to_lsn = sys.fn_cdc_get_max_lsn()
10
11 ),
12
13 CHG_ALL AS(
14
15     SELECT
16
17         CHG.*
18
19     FROM LSN
20
21         CROSS APPLY cdc.fn_cdc_get_all_changes_dbo_tb(LSN.from_lsn, LSN.to_lsn, 'ALL UPDATE OLD') CHG
22
23 ),
24
25 CHG_NET AS(
26
27     SELECT
28
29         CHG.*
30
31     FROM LSN
32
33         CROSS APPLY cdc.fn_cdc_get_net_changes_dbo_tb(LSN.from_lsn, LSN.to_lsn, 'ALL') CHG
34
35 )
36
37 SELECT * FROM CHG_ALL;
  
DSC0005.png
Step 4.2:数据测试  -   更新

Step 4.2.1:数据测试  -   更新整数型列值



Minimsdn.com为您提供的代码:


1     UPDATE dbo.tb SET
2
3         col1 = 11
4
5     WHERE id = 1;
  
查询并[附图]



Minimsdn.com为您提供的代码


1 WITH
2
3 LSN AS(
4
5     SELECT
6
7         from_lsn = sys.fn_cdc_get_min_lsn(N'dbo_tb'),
8
9         to_lsn = sys.fn_cdc_get_max_lsn()
10
11 ),
12
13  
14
15 CHG_ALL AS(
16
17     SELECT
18
19         CHG.*
20
21     FROM LSN
22
23         CROSS APPLY cdc.fn_cdc_get_all_changes_dbo_tb(LSN.from_lsn, LSN.to_lsn, 'ALL UPDATE OLD') CHG
24
25 ),
26
27  
28
29 CHG_NET AS(
30
31     SELECT
32
33         CHG.*
34
35     FROM LSN
36
37         CROSS APPLY cdc.fn_cdc_get_net_changes_dbo_tb(LSN.from_lsn, LSN.to_lsn, 'ALL') CHG
38
39 )
40
41 SELECT * FROM CHG_ALL;
  
DSC0006.png

Step 4.2.1:数据测试  -   通过事务更新整数型列两次



Minimsdn.com为您提供的代码


1 BEGIN TRAN;
2
3     UPDATE dbo.tb SET
4
5         col1 = 44
6
7     WHERE id = 4;
8
9  
10
11     UPDATE dbo.tb SET
12
13         col1 = 444
14
15     WHERE id = 4;
16
17 COMMIT TRAN;
  
查询并[附图]



Minimsdn.com为您提供的代码:


1 WITH
2
3 LSN AS(
4
5     SELECT
6
7         from_lsn = sys.fn_cdc_get_min_lsn(N'dbo_tb'),
8
9         to_lsn = sys.fn_cdc_get_max_lsn()
10
11 ),
12
13 CHG_ALL AS(
14
15     SELECT
16
17         CHG.*
18
19     FROM LSN
20
21         CROSS APPLY cdc.fn_cdc_get_all_changes_dbo_tb(LSN.from_lsn, LSN.to_lsn, 'ALL UPDATE OLD') CHG
22
23 ),
24
25 CHG_NET AS(
26
27     SELECT
28
29         CHG.*
30
31     FROM LSN
32
33         CROSS APPLY cdc.fn_cdc_get_net_changes_dbo_tb(LSN.from_lsn, LSN.to_lsn, 'ALL') CHG
34
35 )
36
37 SELECT * FROM CHG_ALL;
  
DSC0007.png
Step 4.2.3:数据测试  -   更新XML数据列



Minimsdn.com为您提供的代码:


1 UPDATE dbo.tb SET
2
3     col5.modify('replace value of /a[1]/text()[1] with "replace"')
4
5 WHERE id = 1;
6
7  
8
9 UPDATE dbo.tb SET
10
11     col5.modify('insert 1 as last into /')
12
13 WHERE id = 2;
  
查询并[附图]



Minimsdn.com为您提供的代码:


1 WITH
2
3 LSN AS(
4
5     SELECT
6
7         from_lsn = sys.fn_cdc_get_min_lsn(N'dbo_tb'),
8
9         to_lsn = sys.fn_cdc_get_max_lsn()
10
11 ),
12
13 CHG_ALL AS(
14
15     SELECT
16
17         CHG.*
18
19     FROM LSN
20
21         CROSS APPLY cdc.fn_cdc_get_all_changes_dbo_tb(LSN.from_lsn, LSN.to_lsn, 'ALL UPDATE OLD') CHG
22
23 ),
24
25 CHG_NET AS(
26
27     SELECT
28
29         CHG.*
30
31     FROM LSN
32
33         CROSS APPLY cdc.fn_cdc_get_net_changes_dbo_tb(LSN.from_lsn, LSN.to_lsn, 'ALL') CHG
34
35 )
36
37 SELECT * FROM CHG_ALL;
  
DSC0008.png
Step 4.2.3:数据测试  -   更新binary(max) 数据列



Minimsdn.com为您提供的代码:


1 UPDATE dbo.tb SET
2
3     col4 = col4 + 0x12345
4
5 WHERE id = 3;
  
查询并[附图]



Minimsdn.com为您提供的代码:


1 WITH
2
3 LSN AS(
4
5     SELECT
6
7         from_lsn = sys.fn_cdc_get_min_lsn(N'dbo_tb'),
8
9         to_lsn = sys.fn_cdc_get_max_lsn()
10
11 ),
12
13 CHG_ALL AS(
14
15     SELECT
16
17         CHG.*
18
19     FROM LSN
20
21         CROSS APPLY cdc.fn_cdc_get_all_changes_dbo_tb(LSN.from_lsn, LSN.to_lsn, 'ALL UPDATE OLD') CHG
22
23 ),
24
25 CHG_NET AS(
26
27     SELECT
28
29         CHG.*
30
31     FROM LSN
32
33         CROSS APPLY cdc.fn_cdc_get_net_changes_dbo_tb(LSN.from_lsn, LSN.to_lsn, 'ALL') CHG
34
35 )
36
37 SELECT * FROM CHG_ALL;
  
DSC0009.png
Step 4.2.4:数据测试  -   更新主键



Minimsdn.com为您提供的代码:


1 UPDATE dbo.tb SET
2
3     id = 11
4
5 WHERE id = 1;
6
7 INSERT dbo.tb(
8
9     id,
10
11     col1, col2, col3, col4, col5)
12
13 VALUES(
14
15     1,
16
17     1, 'AA', 'AAA', 0x1, 'aa');
  
查询并[附图]



Minimsdn.com为您提供的代码:


1 WITH
2
3 LSN AS(
4
5     SELECT
6
7         from_lsn = sys.fn_cdc_get_min_lsn(N'dbo_tb'),
8
9         to_lsn = sys.fn_cdc_get_max_lsn()
10
11 ),
12
13 CHG_ALL AS(
14
15     SELECT
16
17         CHG.*
18
19     FROM LSN
20
21         CROSS APPLY cdc.fn_cdc_get_all_changes_dbo_tb(LSN.from_lsn, LSN.to_lsn, 'ALL UPDATE OLD') CHG
22
23 ),
24
25 CHG_NET AS(
26
27     SELECT
28
29         CHG.*
30
31     FROM LSN
32
33         CROSS APPLY cdc.fn_cdc_get_net_changes_dbo_tb(LSN.from_lsn, LSN.to_lsn, 'ALL') CHG
34
35 )
36
37 SELECT * FROM CHG_ALL;
  
DSC00010.png
  [最新表结果]
DSC00011.png
-- ====================================================

-- 删除测试



Minimsdn.com为您提供的代码:


1 /*--
2
3 USE master;
4
5 GO
6
7 ALTER DATABASE DB_test SET
8
9     SINGLE_USER
10
11     WITH
12
13         ROLLBACK AFTER 0;
14
15 GO
16
17 DROP DATABASE DB_test;
18
19 --*/
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-81935-1-1.html 上篇帖子: 彻底完全卸载SQL Server 2005 下篇帖子: java连接ms sql server各类问题解析
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表