我需要将一些遗留数据加载到可操作的 oracle (11gR2) 数据库中。jsp/spring/hibernate (3.2.5.ga) 应用程序正在使用该数据库。序列用于在所有表中生成唯一键。序列定义如下:
CREATE SEQUENCE "TEST"."HIBERNATE_SEQUENCE" MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1000 CACHE 20 NOORDER NOCYCLE
数据加载/ETL 的想法是提出一个脚本,该脚本通过运行以最大序列值开始
select HIBERNATE_SEQUENCE.NEXTVAL from dual
在脚本生成过程的开始 - 并为需要填充的数据生成 SQL 插入语句。处理数据清理、业务规则等涉及一些逻辑,这些逻辑通过脚本应用,并且生成的 SQL 插入语句预计将在一批中运行,并且应该能够引入所有遗留数据。
假设最大序列值为 1000 - 脚本将其用作变量并根据需要进行增量,输出 SQL INSERTS 将如下所示:
INSERT INTO USER_STATUS(ID, CREATE_DATE, UPDATE_DATE, STATUS_ID, USER_ID)
VALUES (**1001**, CURRENT_DATE, CURRENT_DATE, 20, 445);
INSERT INTO USER_ACTIVITY_LOG(ID, CREATE_DATE, UPDATE_DATE, DETAILS, LAST_USER_STATUS_ID)
VALUES (**1002**, CURRENT_DATE, CURRENT_DATE, 'USER ACTIVITY 1', **1001**);
INSERT INTO USER_STATUS(ID, CREATE_DATE, UPDATE_DATE, STATUS_ID, USER_ID)
VALUES (**1003**, CURRENT_DATE, CURRENT_DATE, 10, 445);
INSERT INTO USER_ACTIVITY_LOG(ID, CREATE_DATE, UPDATE_DATE, DETAILS, LAST_USER_STATUS_ID)
VALUES (**1004**, CURRENT_DATE, CURRENT_DATE, 'USER ACTIVITY 3', **1003**);
我创建了一些模拟 SQL 来展示输出 INSERTS 的想法 - 插入操作中将涉及更多的表。每当我们需要从后端进行数据更改时,我们将使用 HIBERNATE_SEQUENCE.NEXTVAL 来获取下一个唯一键值。但由于 sql 生成脚本在断开模式下运行,它不使用 HIBERNATE_SEQUENCE.NEXTVAL,而是尝试增加一个局部变量。
我们对能够生成(和运行)这个脚本的假设是
- 将应用程序删除以进行维护
- 在运行脚本期间没有数据库活动,并从最大序列值开始。
- 生成 SQL
运行 SQL - 提交。
假设在脚本生成过程中,最大序列值从 1000 上升到 5000 - 在脚本运行并加载数据之后,需要删除/创建 HIBERNATE_SEQUENCE 以从 5001 开始。
恢复应用程序。
现在,出于我发布此内容的原因,如此详细...我需要您就此设计中的任何漏洞提出建议/意见,以及是否有任何我忽略的内容。
任何输入表示赞赏。
谢谢!