欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

SQLServer 2008 CDC实现数据变更捕获使用图文详解

程序员文章站 2022-10-14 09:47:10
SQLServer 2008 CDC实现数据变更捕获使用图文详解...
适用环境: 代码如下:
在一开始直接执行时,出现了报错信息:

消息22830,级别16,状态1,过程sp_cdc_enable_db_internal,第193 行

无法更新元数据来指示已对数据库adventureworks 启用了变更数据捕获。执行命令'setcdctracked(value = 1)' 时失败。返回的错误为15517: '无法作为数据库主体执行,因为主体"dbo" 不存在、无法模拟这种类型的主体,或您没有所需的权限。'。请使用此操作和错误来确定失败的原因并重新提交请求。

这里引出了另外一个知识点:错误号 15517 的错误

这种错误会在很多地方出现,如还原数据库的时候也会有可能出现。共同点是:某个/些存储过程使用了具有withexecute as 的选项。使其在当前库具有了某个架构,但是当在别的地方执行时,由于没有这个架构,所以就报错,解决方法:

alter authorization on database::[adventureworks] to [sa]

经过检查,uspupdateemployeehireinfo这个存储过程的确有:with execute as caller

使用sa的原因是即使sa被禁用,sa还是存在的。所以不会报错。

现在重新执行:


代码如下:

启用成功,然后通过以下语句检查是否成功:

代码如下:


创建成功后,将自动添加cdc用户和cdc架构。

第二步、对目标表启用cdc: 代码如下: 

例子:

把humanresources.department 这个表开启变更捕获。


代码如下:

然后查询是否成功:



对表开启以后,可以在下图中看到多了很多cdc架构开头的表:

SQLServer 2008 CDC实现数据变更捕获使用图文详解
步骤二:对数据库启用cdc数据库级别功能。必须显式启用: 代码如下:

某些数据库可能存在一些存储过程包含有:execute as 等语句,此时会报错:

SQLServer 2008 CDC实现数据变更捕获使用图文详解
代码如下:

现在检查是否成功:


代码如下:

步骤三:对某些表开启捕获: 代码如下:

结果如图:

SQLServer 2008 CDC实现数据变更捕获使用图文详解
代码如下:

可以从系统表中看到:

SQLServer 2008 CDC实现数据变更捕获使用图文详解
代码如下:

结果如下:

SQLServer 2008 CDC实现数据变更捕获使用图文详解


步骤三:检验: 代码如下:

结果如下:

SQLServer 2008 CDC实现数据变更捕获使用图文详解
代码如下:

可以看到以下截图:

SQLServer 2008 CDC实现数据变更捕获使用图文详解

代码如下:

得到下图:

SQLServer 2008 CDC实现数据变更捕获使用图文详解
3、修改配置:sp_cdc_change_job: 代码如下:

得到以下结果:

SQLServer 2008 CDC实现数据变更捕获使用图文详解
代码如下:

 删除作业:

代码如下:

可以看到现在只剩下一个作业了:

SQLServer 2008 CDC实现数据变更捕获使用图文详解
代码如下:

下面看到已经创建成功:

SQLServer 2008 CDC实现数据变更捕获使用图文详解
代码如下:

然后查询ddl记录表:


代码如下:

可以看到:

6、使用cdc的函数来获取更改: 代码如下: 代码如下:

--检查数据

代码如下:

得到以下结果:


代码如下:

结果:

SQLServer 2008 CDC实现数据变更捕获使用图文详解

注意,由于该表刚好有一个modfieddate字段,所以和更改时间相同.

 d、获取lsn边界:



代码如下:

结果如下:

2012-10-28
  • 2013-07-11
  • 2013-12-02
  • 2014-04-03
  • 2015-01-13