- 最后登录
- 2014-6-14
- 在线时间
- 10 小时
- 威望
- 0
- 金钱
- 66
- 注册时间
- 2013-4-19
- 阅读权限
- 10
- 帖子
- 18
- 精华
- 0
- 积分
- 0
- UID
- 1060
|
1#
发表于 2014-4-28 11:33:47
|
查看: 7373 |
回复: 0
大家好!
我想做一个列过滤,需求如下:
源端:
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
|
|