sql >> データベース >  >> RDS >> Oracle

PL/SQLを使用してトリガーの挿入/更新操作を中止します

    そこに行かないでください。

    ORA-04091: table XXXX is mutating 一般的に、あなたがやろうとしていることは複雑すぎて確実に実行できないことを示す良い指標です。 トリガー付き。

    もちろん、パッケージ配列変数といくつかのトリガー(うーん!) このエラーを回避するために、しかしあなたのコードはおそらく:

    • その複雑さとトリガーの予測不可能な性質のために、保守不可能である
    • マルチユーザー環境にうまく反応しない

    このため、このエラーが発生した場合は、アプローチを再考する必要があります。行間の一貫性に対処するために、パッケージに適切にグループ化された一連のプロシージャを構築することをお勧めします。テーブルを直接DMLするためのすべての特権を取り消し、それらのプロシージャのみを使用してテーブルを変更します。

    たとえば、更新手順はアトミックになります 次のようなプロセス:

    1. 同じ行グループでの同時更新を防ぐためにロックを取得します(たとえば、ホテル予約アプリケーションで部屋のレコードをロックします)。
    2. 挿入する行がすべてのビジネスロジックを検証することを確認します
    3. 関連するすべてのDMLを作成する
    4. エラーが発生した場合は、すべての変更をロールバックします(そして、トランザクション全体ではなく、変更のみをロールバックします)(PL / SQLで簡単に、エラーを発生させるだけです)。



    1. スーパーユーザーの役割がないと拡張機能を作成できません

    2. mysql&php:クエリ結果の一時/仮想ID?

    3. selectステートメントで日時列をUTCから現地時間に変換します

    4. インデックスの統計を収集するか、作成を削除しますか?