0

我需要将一些遗留数据加载到可操作的 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,而是尝试增加一个局部变量。

我们对能够生成(和运行)这个脚本的假设是

  1. 将应用程序删除以进行维护
  2. 在运行脚本期间没有数据库活动,并从最大序列值开始。
  3. 生成 SQL
  4. 运行 SQL - 提交。

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

  6. 恢复应用程序。

现在,出于我发布此内容的原因,如此详细...我需要您就此设计中的任何漏洞提出建议/意见,以及是否有任何我忽略的内容。

任何输入表示赞赏。

谢谢!

4

1 回答 1

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 语句将发出隐式提交,因此一旦它们运行,任何正在进行的事务都将被提交,并且在它们之后执行的任何工作都将是一个单独的事务。

于 2011-08-10T00:08:07.203 回答