0

いくつかのレガシー データをオラクル (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 を使用せず、代わりにローカル変数をインクリメントしようとします。

このスクリプトを生成 (および実行) できるという仮定は、

  1. メンテナンスのためにアプリケーションを停止する
  2. スクリプトの実行中にデータベース アクティビティがなく、最大シーケンス値から開始します。
  3. SQL を生成する
  4. SQL を実行 - コミットします。

  5. スクリプト生成の過程で、最大シーケンス値が 1000 から 5000 に上昇すると仮定すると、スクリプトが実行されてデータがロードされた後、HIBERNATE_SEQUENCE をドロップ/作成して 5001 から開始する必要があります。

  6. アプリケーションを元に戻します。

今、私がこれを投稿している理由について、詳細に... このデザインの抜け穴について、また見落としているものがあれば、あなたの提案/意見が必要です。

どんな入力でも大歓迎です。

ありがとう!

4

1 に答える 1

2

アプリケーションの他のタスクにシーケンスを使用する場合は、シーケンスを削除して作成しないことをお勧めします。これは、権限、シノニムなどを再度追加する必要があることを意味します。

スクリプトの開始時に、何回挿入するか知っていますか? その場合、他のアクティビティがないと仮定すると、シーケンスの「インクリメントバイ」値を調整できるため、シーケンスを1回選択すると、必要な値だけシーケンスが前方に移動します。

> 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 に答える