1

シーケンスが各レコードのプライマリ ID を追加するテーブルがありますが、レコード番号 3 が削除され、3 の ID で挿入し直す必要がありますが、シーケンスが存在するため、誰でもアドバイスできますか? 挿入しようとすると、次のメッセージが表示されます。

ORA-20001: 表の順序番号は内部で提供されています。挿入 SQL ステートメントに含めないでください

ORA-06512: "owner.trigger_name"、4 行目

ORA-04088: トリガー'owner.trigger_name'の実行中にエラーが発生しました

4

1 に答える 1

4

エラーはユーザー定義のORA-20001範囲内にあるため、不平を言っているのは自分のコード (またはアプリケーションのコード) であり、Oracle 自体ではありません。

ID を割り当てているトリガーがサニティ チェックを行っており、挿入中に値が手動で提供されたことを確認すると、その例外が発生しているようです。これは、おそらく自分自身を保護するためであり、現在のシーケンス番号よりも大きい値を入力することを防ぎます。これにより、後でシーケンスが同じ値に達したときにエラーが発生します。(それが主キーであるか、少なくとも一意の制約があると仮定します)。

これは独自のアプリケーション コードからのものであるため、これを回避する唯一の方法は、シーケンスから ID 値を割り当てて例外をスローしているトリガーを特定して無効にすることです。

alter trigger <trigger_name> disable;

...そして、完了したら:

alter trigger <trigger_name> enable;

ただし、停止中、または少なくともこのテーブルに他の挿入がないことを保証できる場合にのみ、これを行います。トリガーが無効になっている間の挿入には、ID が割り当てられません。それらもエラーになるはずです-再びそれが主キーであるか、またはnullではない一意のキーであると仮定します-しかし、それはまだ望ましくありません。

他の挿入を本当に防ぐことができない場合は、(一時的に) 健全性チェックなしでトリガーを再作成できますが、そうであっても、それは簡単なことではありません。

もちろん、それが合成キーである場合、実際のキー値は重要ではありません。その場合、通常の挿入を実行して、再挿入された行の新しい ID 値を取得する必要があります。他のテーブルに参照がある場合3、外部キー制約がないように思えます。これにより、最初にその行が削除されるのを防ぐことができます。

于 2013-10-14T11:17:51.030 に答える