cdshrewd 发表于 2014-4-28 11:33:47

UPDATEDELETES转换及列过滤问题

大家好!
    我想做一个列过滤,需求如下:
    源端:
    create table t_src
(id number primary key,
name varchar2(30),
birthdate date,
n_desc varchar2(200));
    目标端:
create table t_tgt
(id number primary key,
name varchar2(30),
birhdate date,
deletion_flag varchar2(1) default '0',
update_time date);

   我不希望同步源端的n_desc这个字段,同时希望对源端的记录的删除操作,在目标端转换为update操作,同时将deletion_flag由'0'更新为'1'。对于源端的update操作,我希望如果是我过滤掉的列的更新,不做任何处理,在目标端存在的列在更新列值的同时更新update_time为源端事务提交时间。
目前我的replicat参数如下:
REPLICAT REP01
setenv (ORACLE_HOME="/u01/app/oracle/product/11.2.0.3/db_1")
userid goldengate, password AACAAAAAAAAAAAKAPATACEHBIGQGCFZCCDIGAEMCQFFBZHVC,ENCRYPTKEY DEFAULT
--HANDLECOLLISIONS
sourcedefs ./dirdef/f1.def
allownoopupdates
Dynamicresolution
numfiles 3000
DISCARDFILE ./dirrpt/discard_02.DSC,append,megabytes 100
BATCHSQL
DISCARDROLLOVER AT 15:00
REPORTROLLOVER AT 16:00
REPORTCOUNT EVERY 1 HOURS, RATE
UPDATEDELETES
NOCOMPRESSDELETES
MAP TEST."T_SRC" ,TARGET TEST."T_TGT" , COLMAP(USEDEFAULTS, update_time = @GETENV ("GGHEADER", "COMMITTIMESTAMP") ,DELETION_FLAG = @CASE(@GETENV ("GGHEADER", "OPTYPE"),"DELETE","1","0"));

现在已经实现了列过滤和delete操作转换成update,但是目前存在一个问题,就是如果源端更新的字段是n_desc,尽管对目标端而言没有任何记录更新,但是update_time还是会被更新,这不是我期望的结果,我的问题是:如何实现源端被过滤的字段的更新,对目标端update_time字段无影响。举例来说,初始状态:
源端记录:
1,'cds',1985-09-18,'cds is born in 1985-09-18'
目标端:
1,'cds',1985-09-18,'0',2014-04-25
在源端执行:update t_src set n_desc='cds was born in 1985-09-18' where id=1;

在执行以上操作后,目前目标端记录会变成:
1,'cds',1985-09-18,'0',2014-04-28      <----日期发生了变化

我期望的结果是,目标端的update_time不发生变化,记录如下:
1,'cds',1985-09-18,'0',2014-04-25
页: [1]
查看完整版本: UPDATEDELETES转换及列过滤问题