首页 > 数据库 > SQL Server > 正文

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

2024-07-16 17:45:37
字体:
来源:转载
供稿:网友
适用环境:

仅在SQLServer2008(含)以后的企业版、开发版和评估版中可用。

详解:

CDC功能主要捕获SQLServer指定表的增删改操作,由于任何操作都会写日志(哪怕truncate),所以CDC的捕获来源于日志文件。日志文件会把更改应用到数据文件中,同时也会标记符合要求的数据标记为需要添加跟踪的项。然后通过一些配套函数,最后写入到数据仓库中。大概流程:

步骤:本文中以:AdventureWorks为例

第一步、对目标库显式启用CDC:

在当前库使用sys.sp_cdc_enable_db。返回0(成功)或1(失败)。注意,无法对系统数据库和分发数据库启用该功能。且执行者需要用sysadmin角色权限。

该存储过程的作用域是整个目标库。包含元数据、DDL触发器、cdc架构和cdc用户。

使用以下代码启用:


复制代码代码如下:</p><p>USE AdventureWorks</p><p>GO</p><p>EXECUTE sys.sp_cdc_enable_db;
GO</p><p>
在一开始直接执行时,出现了报错信息:

消息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还是存在的。所以不会报错。

现在重新执行:


复制代码代码如下:</p><p>USE AdventureWorks</p><p>GO</p><p>EXECUTE sys.sp_cdc_enable_db;</p><p>GO</p><p>

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

复制代码代码如下:</p><p>SELECT is_cdc_enabled,CASEWHENis_cdc_enabled=0THEN'CDC功能禁用'ELSE'CDC功能启用'END描述</p><p>FROM sys.databases</p><p>WHERE NAME = 'AdventureWorks'



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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表