1

ORMをセットアップし、既存のデータベースでOracleを操作していて、シーケンスにアクセスしたときに挿入を機能させることができましたが、元のアプリケーションでトリガーが使用されていたため、シーケンスは番号をスキップします。

ORMにトリガーを使用させる方法はありますか?

トリガーを無効にすることは、既存のアプリによって使用され、移行中に無効にすることはできないため、オプションではありません。

component persistent="true" table="table_name"  schema="schema_name" { 
   property name="table_id" column="table_id" fieldtype="id" generator="sequence" sequence="schema_name.sequence_name";
...
}
4

2 に答える 2

3

トリガーはアクセス可能なプログラムユニットではありません。トリガーを「呼び出す」唯一の方法は、所有するテーブルに対して適切なDMLを実行することです。

あなたの問題には2つの可能な解決策があります。

  1. トリガーを書き直します。別のアプリケーションがIDを設定するためにトリガーを必要としていると言いますが、条件付きでトリガーのロジックを変更できます。

    if :new.id is null  then
         :new.id := whatever_seq.nextval;  --11g syntax for brevity
    end if;
    

    これにより、他のアプリケーションがテーブルに挿入されたときにIDが入力されますが、値は上書きされません。

  2. 心配するのをやめなさい。シーケンスは、一意の識別子の単なるジェネレータです。数字は上昇しますが、ギャップがあるかどうかは実際には問題ではありません。数十億行を処理していない限り、アプリケーションが廃止される前にシーケンスの数が不足する可能性はほとんどありません。
于 2012-11-08T07:49:45.200 に答える
0

DBは通常、挿入トリガーを使用してIDを割り当てるということですか?それはあなたが数をスキップしている理由を説明するでしょう。挿入が発生した後(およびトリガーが起動された後)に休止状態になってIDを読み戻すgenerator="select"を試すことができます。あなたが説明していると思う状況を正確に処理するためにあります。

于 2012-11-08T09:36:13.873 に答える