2011-08-09 2 views
0

작동중인 Oracle 데이터베이스 (11gR2)에 일부 레거시 데이터를로드해야합니다. 데이터베이스는 jsp/spring/hibernate (3.2.5.ga) 응용 프로그램에서 사용 중입니다. 시퀀스는 모든 테이블에서 고유 키를 생성하는 데 사용됩니다. 시퀀스 정의는 다음과 같습니다 :jsp/spring/hibernate 어플리케이션에서 사용되는 ETL을 오라클 데이터베이스로 변환

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 Insert 문은 한 배치에서 실행되어야하며 모든 기존 데이터를 가져올 수 있어야합니다.

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을 생성 한 다음 스크립트가 변수만큼이 사용하고 단위가 필요하며, 출력 SQL 인서트가 아래와 같은 것 - 최대 시퀀스 값이 1000이라고 가정

출력 INSERT가 어떻게 될지 아이디어를 보여줍니다. 삽입 작업에 더 많은 테이블이 포함될 것입니다. 백엔드에서 데이터를 변경해야 할 때마다 HIBERNATE_SEQUENCE.NEXTVAL을 사용하여 다음 고유 키 값을 얻습니다. 하지만 SQL 생성 스크립트는 연결이 끊긴 모드에서 실행되므로 HIBERNATE_SEQUENCE.NEXTVAL은 사용하지 않고 대신 로컬 변수를 증가시킵니다.

우리가

  1. 응용 프로그램이 스크립트를 실행하는 동안
  2. 에는 데이터베이스 활동이없는 유지 보수를 위해 아래로 촬영 한이 스크립트는 생성 (실행) 할 수있는에 대해 발생하는 가정 및 최대 순서 값으로 시작하십시오.
  3. SQL
  4. SQL - commit을 실행하십시오.

  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 문은 암시 적 커밋 발행된다는 점에 유의.

+0

이러한 제안에 감사드립니다. 예, 스크립트에서 키가 증가함에 따라 삽입 과정의 수를 알 수 있습니다. – user12002221

관련 문제