it-swarm.com.de

Was sind die Ursachen und Lösungen für mutierende Tabellenfehler?

Ich verstehe, dass mutierende Tabellenfehler durch einen Konstruktionsfehler oder eine problematische Abfrage verursacht werden.

Kürzlich wurde eine alte Abfrage in Betrieb genommen, die einen mutierenden Tabellenfehler auslöst. Unser DBA hat das Problem gelöst, aber wir wissen nicht wie.

Was genau verursacht mutierende Tabellenfehler und wie hätte unser DBA das Problem behoben?

12
parmanand

Die wahrscheinlichste Ursache für einen mutierenden Tabellenfehler ist der Missbrauch von Triggern. Hier ist ein typisches Beispiel:

  1. sie fügen eine Zeile in Tabelle A ein
  2. ein Trigger in Tabelle A (für jede Zeile) führt eine Abfrage in Tabelle A aus, um beispielsweise eine Zusammenfassungsspalte zu berechnen
  3. Oracle löst einen ORA-04091 aus: Tabelle A mutiert, Trigger/Funktion sehen sie möglicherweise nicht

Dies ist ein erwartetes und normales Verhalten. Oracle möchte Sie vor sich selbst schützen, da Oracle Folgendes garantiert:

  • (i) dass jede Aussage atomar ist (d. h. entweder fehlschlägt oder vollständig erfolgreich ist)
  • (ii) dass jede Aussage eine konsistente Ansicht der Daten sieht

Wenn Sie diese Art von Trigger schreiben, erwarten Sie höchstwahrscheinlich, dass in der Abfrage (2) die in (1) eingefügte Zeile angezeigt wird. Dies würde im Widerspruch zu beiden obigen Punkten stehen, da das Update noch nicht abgeschlossen ist (es könnten weitere Zeilen eingefügt werden).

Oracle könnte das Ergebnis in Übereinstimmung mit einem Zeitpunkt kurz vor dem zurückgeben Anfang der Anweisung, aber aus den meisten Beispielen, die ich gesehen habe, die versuchen, diese Logik zu implementieren, sehen die Leute eine mehrzeilige Anweisung als eine Reihe aufeinanderfolgender Schritte und erwarten, dass die Anweisung [2] die durch die vorherigen Schritte vorgenommenen Änderungen sieht. Oracle kann das erwartete Ergebnis nicht zurückgeben und löst daher den Fehler aus.

Zur weiteren Lektüre: "Mutationstabelle" auf Ask Tom .

Wenn, wie ich vermute, die Ursache für den Mutationstabellenfehler ein Trigger ist, besteht eine Möglichkeit, den Fehler zu vermeiden, darin, die Logik aus dem Trigger in Prozeduren zu verschieben.

17
Vincent Malgrat

Eine mutierende Tabelle tritt auf, wenn eine Anweisung einen Trigger auslöst und dieser Trigger auf die Tabelle verweist, die den Trigger verursacht hat. Der beste Weg, um solche Probleme zu vermeiden, besteht darin, keine Trigger zu verwenden, aber ich vermute, der DBA hat sich dafür nicht die Zeit genommen. Er hätte eine der folgenden Aktionen ausführen können:

9
Leigh Riffel