6

私は巨大なpl/sqlストアドプロシージャを持っており、挿入する限りいくつかの削除を行います。手順はステートメントから始まります

 EXECUTE IMMEDIATE 'SET CONSTRAINTS ALL DEFERRED'

そして最後のcommitステートメントでORA-02292を受け取ります:整合性制約AAAに違反しました。質問は、親テーブルからの削除(子1の前)と親の前の子テーブルへの挿入の両方があるため、どのステートメントが正確にそれを引き起こしているのかわからないということです。私はそれをグーグルしようとしました、しかしどこでも私が削除しようとするときだけ02292が起こると言われています。

子テーブルに値を挿入しようとしたが、親にこのエントリがない場合、このエラーが発生する可能性がありますか?

また、02292と02291の違いは何ですか?

4

2 に答える 2

13

ORA-02292は、A)制約にON DELETE句が指定されていないため、およびB)子表に一致する参照がある行をマスター表から削除したためにエラーが発生したことを示しています。制約を変更してONDELETECASCADEを設定するか、マスターから削除する前にすべての子レコードが確実に削除されるようにするかを選択できます。私の好みはONDELETECASCADEを追加することですが、そうしない理由があるかもしれないと思います。ORA-02292を参照してください。

ORA-02291はこれとは逆です。子テーブルに行を挿入しようとするとORA-02291が発生しますが、制約で指定された新しい子行のキー・フィールド値がマスター表に存在しません。ORA-02291を参照してください。

于 2012-06-15T18:41:31.463 に答える
3

名前から制約を無効にしてORA-02292を解決する場合。

  1. その制約にバインドされているテーブル名を探します

    SELECT owner, table_name FROM dba_constraints WHERE constraint_name = '{CONSTRAINT_NAME}';

  2. 制約を無効にします(このコマンドは管理者ユーザーが実行する必要があります)

    ALTER TABLE {TABLE_NAME} DISABLE constraint {CONSTRAINT_NAME} cascade;

于 2017-01-27T11:00:38.487 に答える