当复合密钥和“始终以身份生成”选项不起作用时,如何在Oracle中创建主密钥?

时间:2018-08-07 21:56:43

标签: sql oracle ssis

我正在研究一个SSIS项目,该项目每月从Excel中提取数据并加载到Oracle数据库中。我计划从Excel文件中提取数据并加载到Oracle阶段表中。我将使用merge语句,因为每个月加载的数据是12个月的滚动列表,并且数据可以更改,因此当记录不匹配时需要能够插入或在记录不匹配时可以更新。我的控制流程如下所示:截断舞台表(以清除上一次运行的程序包中的表)--->从Excel到舞台表的数据流--->在Oracle中合并到目标表。

我的问题是源Excel文件中的数据没有任何唯一的列来选择主键或复合键,因为新记录可能完全相同(但非常不可能)信息。我无法利用“始终以身份生成的身份”,因为我的SSIS程序包需要在每个作业开始时进行截断,以清除阶段表。这样会在新的负载中生成相同的ID号,并在目标表中产生问题。

关于如何解决此问题的任何建议?

1 个答案:

答案 0 :(得分:0)

欢迎使用SO和ETL。在SSIS中,不使用暂存表,而使用两个源:Excel文件和现有生产表。对两个输入进行排序,然后对唯一标识符执行合并联接。从那里开始,使用派生的列转换来添加一个名为“ Action”的新列,该列将根据联接键是否为NULL将行标记为INSERT / UPDATE / DELETE。所以:

  1. 文件中的NULL表示DELETE(不在文件中,不在数据库中)
  2. 数据库中的NULL表示INSERT(在文件中,而不在数据库中)
  3. 非NULL都意味着UPDATE(在文件中,在数据库中)

从那里,使用条件拆分将行拆分到OLE DB目标(INSERT)或SQL命令(UPDATE或DELETE)。现在,您可以从流程中删除舞台环境和MERGE命令。假设SSIS在单独的服务器上运行,这具有从SQL Server删除ETL负载的额外好处。

注意:排序转换可以删除重复项。