Je comprends que les erreurs de table en mutation sont causées par un défaut de conception ou une requête problématique.
Une ancienne requête a récemment été mise en production, ce qui génère une erreur de table en mutation. Notre DBA a résolu le problème mais nous ne savons pas comment.
Qu'est-ce qui cause exactement les erreurs de table de mutation et comment notre DBA aurait-il résolu le problème?
La cause la plus probable d'une erreur de table en mutation est l'utilisation abusive des déclencheurs. Voici un exemple typique:
Il s'agit d'un comportement normal et attendu, Oracle veut vous protéger de vous-même car Oracle garantit:
Très probablement, lorsque vous écrivez ce type de déclencheur, vous vous attendez à ce que la requête (2) voit la ligne insérée sur (1). Cela serait en contradiction avec les deux points ci-dessus car la mise à jour n'est pas encore terminée (il pourrait y avoir plus de lignes à insérer).
Oracle pourrait retourner le résultat cohérent avec un point dans le temps juste avant le au début de l'instruction, mais à partir de la plupart des exemples que j'ai vus qui tentent d'implémenter cette logique, les gens voient une instruction à plusieurs lignes comme une série d'étapes successives et s'attendent à ce que l'instruction [2] voie les modifications apportées par les étapes précédentes. Oracle ne peut pas retourner le résultat attendu et renvoie donc l'erreur.
Pour en savoir plus: "table mutante" sur Ask Tom .
Si, comme je le soupçonne, la cause de l'erreur de la table de mutation est un déclencheur, une façon d'éviter l'erreur consiste à déplacer la logique du déclencheur dans les procédures.
Un table en mutation se produit lorsqu'une instruction provoque le déclenchement d'un déclencheur et que ce déclencheur fait référence à la table qui a provoqué le déclencheur. La meilleure façon d'éviter de tels problèmes est de ne pas utiliser de déclencheurs, mais je pense que le DBA n'a pas pris le temps de le faire. Il aurait pu faire l'une des choses suivantes: