是一个个利用CDC铺货目标数据表的变动的操作,Oracle我也是现学现用。
我根据http://www.wewill.cn/n22923c46.aspx的介绍,严格按照上面的每一步操作,而且我确定每一步操作都成功了,但是我怎样都获取不到目标表的更新,让人很是郁闷,哪位有经验的兄弟姐妹能帮一把否。多谢哉为预防大家打不开链接,我结合http://www.wewill.cn/n22923c46.aspx的内容,把我的操作过程描述如下:
发布部分操作如下:首先,我在我的测试数据库 pqOracleDB里建立一个Schema,名称为 pqstone,然后再建立一个TableSpace,名称为pqTableSpace
然后,使用pqstone,建立表 table001,两个字段 userId int,userName char(16),表空间为 pqTableSpace
然后根据上文链接文章中的内容,给用户pqstone设置权限,我设置权限的语句如下:CREATE USER pqstone IDENTIFIED BY pqstone DEFAULT TABLESPACE pqTableSpace QUOTA UNLIMITED ON SYSTEM QUOTA UNLIMITED ON SYSAUX;
GRANT CREATE SESSION TO pqstone; 
GRANT CREATE TABLE TO pqstone;
GRANT CREATE TABLESPACE TO pqstone;
GRANT UNLIMITED TABLESPACE TO pqstone;
GRANT SELECT_CATALOG_ROLE TO pqstone;
GRANT EXECUTE_CATALOG_ROLE TO pqstone;
GRANT CONNECT, RESOURCE TO pqstone;
第二步,我按照资料的提示,创建ChangeSet(同步模式),语句如下:BEGIN
DBMS_CDC_PUBLISH.CREATE_CHANGE_SET( 
change_set_name => 'pqChangeSet', 
description => 'Change set for table001', 
change_source_name => 'SYNC_SOURCE');
END;
第三步,创建变更表BEGIN
DBMS_CDC_PUBLISH.CREATE_CHANGE_TABLE(
owner => 'pqstone',
change_table_name => 'table001_ct', 
change_set_name => 'pqChangeSet',
source_schema => 'pqstone',
source_table => 'table001',
column_type_list => 'userId int,userName char(16)',
capture_values => 'both',
rs_id => 'y', 
row_id => 'n',
user_id => 'n',
timestamp => 'n',
object_id => 'n',
source_colmap => 'y',
target_colmap => 'y',
options_string => 'TABLESPACE pqTableSpace');
END;
最后,资料里发布的最后一步是授权,原文如下:GRANT SELECT ON cdcpub.jobhist_ct TO subscriber1;但是我的理解是,在本数据库,在同一用户下做cdc订阅测试,应该不需要再给变更表的授权了,所以这一步刚开始没有做

订阅部分操作如下:
第一步,根据资料说明,使用以下语句确认发布成功SELECT * FROM ALL_SOURCE_TABLES; /*确认源表发布成功*/
SELECT UNIQUE CHANGE_SET_NAME, COLUMN_NAME, PUB_ID /*确认发布集创建成功*/
FROM ALL_PUBLISHED_COLUMNS 
WHERE SOURCE_SCHEMA_NAME ='PQSTONE' AND SOURCE_TABLE_NAME = 'TABLE001';
第二步,创建订阅,语句如下:BEGIN
DBMS_CDC_SUBSCRIBE.CREATE_SUBSCRIPTION(
change_set_name => 'pqChangeSet',
description => 'Change data for table001',
subscription_name => 'Test_SUB');
END;
第三步,设置订阅列,语句如下:BEGIN
DBMS_CDC_SUBSCRIBE.SUBSCRIBE(
subscription_name => 'Test_SUB',
source_schema => 'pqstone',
source_table => 'table001',
column_list => 'userId int,userName char(16)',
subscriber_view => 'Test_VIEW');
END;
第四步,激活我建立的订阅,语句如下:BEGIN
DBMS_CDC_SUBSCRIBE.ACTIVATE_SUBSCRIPTION(
subscription_name => 'Test_SUB');
END;

开始测试
首先,我使用sql语句,在表table001插入一行数据insert into table001(userId,userName) values(1,'pqstone');
第二部,根据资料内容,执行一次获取变更数据的命令,语句如下:
BEGIN
DBMS_CDC_SUBSCRIBE.PURGE_WINDOW(
subscription_name => 'Test_SUB');
END;
[color=#FF0000]最后,检索变更数据,按照资料,应该在这一步在视图Test_VIEW中能够检索到源表table001的变更内容,但是我操作完上面所有的步骤后,Test_View依然不能捕获table001的数据插入,希望哪位有经验的大侠指点一下。
[/color]