La causa más probable de un error en la tabla de mutaciones es el mal uso de los desencadenantes. Aquí está un ejemplo típico:
- inserta una fila en la tabla A
- un disparador en la tabla A (para cada fila) ejecuta una consulta en la tabla A, por ejemplo, para calcular una columna de resumen
- Oracle lanza un ORA-04091: la tabla A está mutando, es posible que el disparador / función no lo vea
Este es un comportamiento esperado y normal, Oracle quiere protegerlo de usted mismo ya que Oracle garantiza:
- (i) que cada declaración es atómica (es decir, fallará o tendrá éxito por completo)
- (ii) que cada declaración ve una vista consistente de los datos
Lo más probable es que cuando escriba este tipo de desencadenante espere que la consulta (2) vea la fila insertada en (1). Esto estaría en contradicción con los dos puntos anteriores ya que la actualización aún no ha finalizado (podría haber más filas para insertar).
Oracle podría devolver el resultado consistente con un punto en el tiempo justo antes del comienzo de la declaración, pero a partir de la mayoría de los ejemplos que he visto que intentan implementar esta lógica, las personas ven una declaración de varias filas como una serie de pasos sucesivos y esperan que declaración [2] para ver los cambios realizados por los pasos anteriores. Oracle no puede devolver el resultado esperado y, por lo tanto, arroja el error.
Para más información: "tabla de mutaciones" en Ask Tom .
Si sospecho que la causa del error de la tabla de mutaciones es un desencadenante, una forma de evitar el error es mover la lógica del desencadenante a los procedimientos.