<p><br>CDC:Change Data Capture<br></p><div class="codetitle"><span><a class="copybut" data="89559" id="copybut89559"><u>复制代码</u></a></span> 代码如下:</div><div class="codebody" id="code89559"><br>--步骤:本文中以GPOSDB为例
<p>--第一步、对目标库显式启用CDC:<br>--在当前库使用sys.sp_cdc_enable_db。返回0(成功)或1(失败)。<br>--注意,无法对系统数据库和分发数据库启用该功能。且执行者需要用sysadmin角色权限。<br>--该存储过程的作用域是整个目标库。包含元数据、DDL触发器、cdc架构和cdc用户。<br>--使用以下代码启用:<br>USE GPOSDB --要启用CDC的数据库<br>GO<br>EXECUTE sys.sp_cdc_enable_db;<br>GO<br>--在一开始直接执行时,出现了报错信息:<br>--消息22830,级别16,状态1,过程sp_cdc_enable_db_internal,第193 行<br>--无法更新元数据来指示已对数据库AdventureWorks 启用了变更数据捕获。<br>--执行命令'SetCDCTracked(Value = 1)' 时失败。<br>--返回的错误为15517: '无法作为数据库主体执行,因为主体"dbo"<br>--不存在、无法模拟这种类型的主体,或您没有所需的权限。'。请使用此操作和错误来确定失败的原因并重新提交请求。<br>--这里引出了另外一个知识点:错误号 15517 的错误<br>--这种错误会在很多地方出现,如还原数据库的时候也会有可能出现。<br>--共同点是:某个/些存储过程使用了具有WITHEXECUTE AS 的选项。<br>--使其在当前库具有了某个架构,但是当在别的地方执行时,由于没有这个架构,所以就报错,解决方法:<br>ALTER AUTHORIZATION ON DATABASE::[GPOSDB] TO [sa]</p>
<p>--经过检查,uspUpdateEmployeeHireInfo这个存储过程的确有:WITH EXECUTE AS CALLER<br>--使用sa的原因是即使sa被禁用,sa还是存在的。所以不会报错。<br>--现在重新执行:<br>USE GPOSDB<br>GO<br>EXECUTE sys.sp_cdc_enable_db;<br>GO<br>--启用成功,然后通过以下语句检查是否成功:<br>SELECT <br>is_cdc_enabled,<br>CASE WHEN is_cdc_enabled=0 THEN 'CDC功能禁用' ELSE 'CDC功能启用' END 描述<br>FROM sys.databases<br>WHERE NAME = 'GPOSDB'</p>
<p>--创建成功后,将自动添加CDC用户和CDC架构。<br>--在用户和架构下面可以看到cdc用户和cdc架构</p>
<p>--创建这两个用户、架构的原因是因为CDC要求独占方式使用这两个架构,所以要单独创建。<br>--如果存在了非CDC功能创建的CDC用户、架构的话,则需要先删除该cdc命名的架构,才能开启。</p>
<p>--第二步、对目标表启用CDC:<br>--使用db_owner角色的成员执行sys.sp_cdc_enable_table为每个需要跟踪的表创建捕获实例。<br>--然后通过sys.tables目录视图中的is_tracked_by_cdc列来判断是否创建成功。<br>--默认情况下会对表的全部列做捕获。如果只需要对某些列做捕获,<br>--可以使用@captured_column_list参数指定这些列。<br>--如果要把更改表放到文件组里的话,最好创建单独的文件组(最起码与源表独立)。</p>
<p>--如果不想控制访问角色,则@role_name必须显式设置为null。<br>sys.sp_cdc_enable_table<br> [ @source_schema = ] 'source_schema',<br> [ @source_name = ] 'source_name' ,<br> [ @role_name = ] 'role_name'<br> [,[ @capture_instance = ] 'capture_instance' ]<br> [,[ @supports_net_changes = ] supports_net_changes ]<br> [,[ @index_name = ] 'index_name' ]<br> [,[ @captured_column_list = ] 'captured_column_list' ]<br> [,[ @filegroup_name = ] 'filegroup_name' ]<br> [,[ @partition_switch = ] 'partition_switch' ]</p>
<p>--例子:<br>--把SYSTEMPARA 这个表开启变更捕获。<br>USE GPOSDB<br>GO<br>EXEC sys.sp_cdc_enable_table @source_schema = 'DBO',<br> @source_name = 'SYSTEMPARA',@role_name = NULL</p>
<p>--然后查询是否成功:<br>SELECT name ,<br> is_tracked_by_cdc ,<br> CASE WHEN is_tracked_by_cdc = 0 THEN 'CDC功能禁用'<br> ELSE 'CDC功能启用'<br> END 描述<br>FROM sys.tables<br>WHERE OBJECT_ID = OBJECT_ID('dbo.systempara')<br>--对表开启以后,可以在下图中看到多了很多cdc架构开头的表:<br>--刷新一下GPOSDB数据库,在系统表下面可以看到多了下面几张表<br>[cdc].[DBO_SYSTEMPARA_CT]<br>[cdc].[change_tables]<br>[cdc].[captured_columns]<br>[cdc].[ddl_history]<br>[cdc].[index_columns]<br>[cdc].[lsn_time_mapping]<br>[dbo].[systranschemas]<br>[dbo].[dtproperties]</p>
<p>--启动之后,可以看到SQLServer代理里面的作业,也出现了这两个作业:<br>[cdc.GPOSDB_capture]<br>[cdc.GPOSDB_cleanup]</p>
<p>--在可编程性-》函数-》表值函数里,也多了两个函数<br>[cdc].[fn_cdc_get_all_changes_DBO_SYSTEMPARA]<br>[cdc].[fn_cdc_get_net_changes_DBO_SYSTEMPARA]</p>
<p>--下面列出相关的存储过程:<br> |
|