我需要有装入操作的Oracle(11gR2的)数据库一些遗留的数据。数据库正在被jsp/spring/hibernate(3.2.5.ga)应用程序使用。一个序列用于在所有表中生成唯一键。序列定义如下:ETL到操作Oracle数据库 - 由JSP /弹簧使用/休眠应用
CREATE SEQUENCE "TEST"."HIBERNATE_SEQUENCE" MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1000 CACHE 20 NOORDER NOCYCLE
的理念,为数据加载/ ETL是拿出wtih,通过在开始时运行
select HIBERNATE_SEQUENCE.NEXTVAL from dual
与最大序列值开始的脚本脚本生成过程 - 并为需要填充的数据生成SQL Insert语句。在处理数据清理,业务规则等方面涉及到通过脚本应用应用程序的一些逻辑,生成的SQL插入语句预计将在一批中运行,并且应该能够引入所有遗留数据。
假设最大序列值是1000 - 脚本使用这个作为的变量,增量是必要的,输出SQL插入将是如下:
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开始删除/创建。
把应用备份。
现在,由于我发布这个,在这样的细节...我需要你的建议/输入有关这个设计的任何漏洞,如果有什么我俯瞰。
任何输入表示赞赏。
谢谢!
谢谢你的建议。是的,我会知道过程中涉及的插入数量,因为密钥在脚本中增加。 – user12002221