我需要有裝入操作的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