2011-08-09 37 views
0

我需要有装入操作的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,而是尝试增加一个局部变量。

我们有大约能产生(并运行)这个脚本是

  1. 已经在运行该脚本时采取停机维护应用
  2. 没有数据库活动的假设和从最大序列值开始。
  3. 生成SQL
  4. 运行SQL - 提交。

  5. 假设在脚本生成过程中,最大序列值从1000增加到5000 - 在脚本运行并载入数据之后,HIBERNATE_SEQUENCE需要从5001开始删除/创建。

  6. 把应用备份。

现在,由于我发布这个,在这样的细节...我需要你的建议/输入有关这个设计的任何漏洞,如果有什么我俯瞰。

任何输入表示赞赏。

谢谢!

回答

2

我会建议反对删除和创建如果您的应用程序用于任何其他任务的顺序,这样做意味着你还需要重新添加任何权限,同义词等。

你知道在脚本,你有多少做插入的开始?如果是这样,并且假设您不会有任何其他活动,那么您可以调整序列的“增加量”值,因此只需从中选择一个值即可将序列向前移动任意值。

> drop sequence seq_test; 
sequence SEQ_TEST dropped. 
> create sequence seq_test start with 1 increment by 1; 
sequence SEQ_TEST created. 
> select seq_test.nextval from dual; 
NEXTVAL     
---------------------- 
1      

> alter sequence seq_test increment by 500; 
sequence SEQ_TEST altered. 
> select seq_test.nextval from dual; 
NEXTVAL     
---------------------- 
501      

> alter sequence seq_test increment by 1; 
sequence SEQ_TEST altered. 
> select seq_test.nextval from dual; 
NEXTVAL     
---------------------- 
502  

要知道,DDL语句会发出一个隐含的承诺,所以一旦他们已经运行的任何正在进行的事务将被COMMITED,并在他们之后进行的任何工作将是一个单独的事务。

+0

谢谢你的建议。是的,我会知道过程中涉及的插入数量,因为密钥在脚本中增加。 – user12002221