我一直试图解决这个问题,并且需要你的帮助才能实现。我在informatica中创建了一个ETL进程,它从sql server(源数据库)中获取用户并将它们添加到mysql(目标数据库)中 该过程涉及许多步骤。
步骤1. - 将source.dbo。[user](SQL SERVER)移动到目标。user
用户表看起来像这样
userid username profile disabled
1 A A 0
2 B A 0
3 c B 1
当更改禁用状态和添加新记录时,此表将被挂起
步骤2 - 然后将新用户插入到target.worker表中; 为了仅添加工作表中不存在的用户,使用左连接:
select wrk.*, usr.* from target.worker
wrk left join target.user usr on wrk.userid=usr.userid
where wrk.usrid is null;
工作表看起来像这样
id username userid disabled
1 A 1 0
2 B A 0
然后在进程运行后,userid 3将被添加到worker表
现在我的部分无法弄清楚: 当他们的禁用状态也发生变化时,我需要更新worker表中的用户。 目前,我已将映射设置为在左连接中添加来自用户的工作者,以仅添加当前工作表中不存在的那些用户。 但是,如何映射它以便在相应用户表中禁用状态更改时更新工作表中的记录
我希望这是有道理的。 为了简化:
目标时。[用户]是
userid username profile disabled
1 A A 0
2 B A 0
3 c B 1
4 D C 0
和target.worker是
userid username profile disabled
1 A A 0
2 B A 0
3 c B 0
我需要一个带有过滤器或说明过程的连接查询,以便worker表插入新记录并更改现有记录禁用状态:所以它看起来像这样
userid username profile disabled
1 A A 0
2 B A 0
3 c B 1 <--- Record updated
4 D C 0 <-- New record added
答案 0 :(得分:1)
在target.worker上使用Lookup来验证记录是否已存在。如果它确实是NewLookupRow将是2(更新),则在Update Transformation中使用DD_UPDATE。如果是1,请使用DD_INSERT。在Update Trans之前使用NewLookupRow!= 0过滤器以跳过目标中已有的行。