Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Einfüge-/Aktualisierungsvorgang im Trigger mit PL/SQL abbrechen

Gehen Sie nicht dorthin.

ORA-04091: table XXXX is mutating ist im Allgemeinen ein guter Indikator dafür, dass das, was Sie zu tun versuchen, zu komplex ist, um zuverlässig ausgeführt zu werden mit Triggern.

Sicher, Sie könnten eine Paket-Array-Variable und eine Handvoll Trigger ( ach!) um diesen Fehler zu umgehen, aber Ihr Code wird höchstwahrscheinlich:

  • aufgrund seiner Komplexität und der Unvorhersehbarkeit von Auslösern nicht wartbar sein
  • reagieren nicht gut auf eine Umgebung mit mehreren Benutzern

Aus diesem Grund sollten Sie Ihre Vorgehensweise überdenken, wenn Sie auf diesen Fehler stoßen. Ich rate Ihnen, eine Reihe von Prozeduren zu erstellen, die schön in einem Paket gruppiert sind, um die Konsistenz zwischen den Zeilen zu bewältigen. Widerrufen Sie alle Berechtigungen, um die Tabelle direkt per DML zu bearbeiten, und verwenden Sie nur diese Verfahren, um sie zu ändern.

Zum Beispiel wäre Ihr Update-Vorgang ein atomarer Vorgang Prozess, der:

  1. eine Sperre erwerben, um eine gleichzeitige Aktualisierung derselben Zeilengruppe zu verhindern (z. B. den Zimmerdatensatz in einer Hotelreservierungsanwendung sperren).
  2. überprüfen Sie, ob die einzufügende Zeile die gesamte Geschäftslogik validiert
  3. alle relevanten DML erstellen
  4. rollt alle seine Änderungen (und nur seine Änderungen – nicht die ganze Transaktion) im Fehlerfall zurück (einfach mit PL/SQL, löst einfach einen Fehler aus).