いくつかのレガシー データをオラクル (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 Insert ステートメントを生成しました。スクリプトを介して適用されるデータのクリーンアップ、ビジネス ルールなどの処理に関連するいくつかのロジックがあり、生成された SQL Insert ステートメントは 1 つのバッチで実行されることが期待され、すべてのレガシー データを取り込むことができるはずです。
最大シーケンス値が 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**);
出力INSERTSがどのようになるかを示すために、いくつかの模擬SQLを作成しました。挿入操作には、さらに多くのテーブルが含まれます。バックエンドからデータを変更する必要があるときはいつでも、HIBERNATE_SEQUENCE.NEXTVAL を使用して次の一意のキー値を取得します。ただし、SQL 生成スクリプトは非接続モードで実行されるため、HIBERNATE_SEQUENCE.NEXTVAL を使用せず、代わりにローカル変数をインクリメントしようとします。
このスクリプトを生成 (および実行) できるという仮定は、
- メンテナンスのためにアプリケーションを停止する
- スクリプトの実行中にデータベース アクティビティがなく、最大シーケンス値から開始します。
- SQL を生成する
SQL を実行 - コミットします。
スクリプト生成の過程で、最大シーケンス値が 1000 から 5000 に上昇すると仮定すると、スクリプトが実行されてデータがロードされた後、HIBERNATE_SEQUENCE をドロップ/作成して 5001 から開始する必要があります。
アプリケーションを元に戻します。
今、私がこれを投稿している理由について、詳細に... このデザインの抜け穴について、また見落としているものがあれば、あなたの提案/意見が必要です。
どんな入力でも大歓迎です。
ありがとう!