Publicado 29. septiembre 2014
Actualizado en octubre de 2025
Introducción
El asistente para desencadenadores de tablas mutantes de la aplicación Hora de KeepTool ofrece una forma elegante de gestionar uno de los errores más comunes de Oracle:
ORA-04091: la tabla … está mutando, el disparador/función puede no verla.
Este error suele producirse cuando un disparador o una función intenta leer o modificar una tabla que ya está siendo modificada por la misma instrucción DML.

Error ORA-04091: la tabla está mutando
Por qué se produce el error
En muchos diseños de bases de datos del mundo real, los desarrolladores quieren mantener datos resumidos o agregados en tablas maestras.
Por ejemplo, imagina una columna AVERAGE_SALARY en la DEPARTMENTS tabla que se actualice automáticamente cada vez que cambie el salario de un empleado en EMPLOYEES.
Si intenta hacer esto con un disparador a nivel de fila, Oracle genera el error de tabla en proceso de modificación, ya que el disparador intenta consultar la misma tabla que aún se está modificando.

El disparador AFTER_DELETE-STMT en EMPLOYEES actualiza la tabla maestra DEPARTMENTS
Uso del asistente para desencadenantes de tabla mutante
El asistente para desencadenadores de tabla mutante de Hora simplifica este problema creando automáticamente un desencadenador compuesto de Oracle.
Puede iniciar el asistente desde el explorador de esquemas haciendo clic con el botón derecho del ratón en una tabla y seleccionando «Asistente para desencadenadores de tabla mutante».

Inicio del asistente para desencadenantes mutantes mediante el menú contextual de la página de desencadenantes
El asistente detecta las relaciones entre las tablas maestras y las de detalle y propone valores predeterminados adecuados.
En nuestro ejemplo, hemos cambiado el nombre del desencadenante de EMPLOYEES_CM a UPDATE_AVERAGE_SALARY_CM, elegimos la función de agregado (por ejemplo, AVG) y seleccionamos la columna que se va a agregar (SALARY).
Dado que la EMPLOYEES tabla se relaciona con varias tablas maestras, nos aseguramos de seleccionar la correcta (DEPARTMENTS).

Uso del asistente para tablas mutantes: seleccione la columna agregada y la clave externa para la tabla maestra
Después de confirmar con Aceptar y mantener habilitada la vista previa de SQL, Hora genera automáticamente el código de disparador compuesto correspondiente.

Código de disparador compuesto generado por el asistente
Comprensión del disparador generado
El disparador compuesto generado se divide en varias secciones:
-
Sección de declaración: define las colecciones o variables utilizadas durante el procesamiento.
-
Sección BEFORE EACH ROW: recopila los valores afectados DEPARTMENT_ID a medida que se modifican las filas.
-
Sección AFTER STATEMENT: se ejecuta una vez finalizadas todas las operaciones DML, calcula los resultados agregados y actualiza la tabla maestra.
Dado que la actualización de la tabla maestra se produce después de que se hayan procesado todas las filas de detalle, nunca se da la condición de tabla mutante.
También puede mejorar el código generado añadiendo sentencias personalizadas, por ejemplo:
Resumen
Con el asistente Mutating Table Trigger Wizard, KeepTool ofrece una forma rápida y fiable de resolver ORA-04091 errores.
El asistente crea automáticamente un disparador compuesto totalmente funcional, lo que garantiza que las actualizaciones de las tablas maestras se realicen de forma segura después de las operaciones a nivel de fila.
Esta función no solo evita los errores de mutación de tablas, sino que también ahorra un tiempo de desarrollo significativo al gestionar los desencadenantes DELETE, UPDATE e INSERT en bases de datos Oracle.
➡️ Pruebe KeepTool gratis
Las herramientas Oracle de KeepTool están diseñadas específicamente para desarrolladores, administradores de bases de datos (DBA) y equipos de soporte. Con más de 25 años de experiencia, optimizamos continuamente nuestro software para que el análisis y la documentación de sus bases de datos sean más rápidos, eficientes y claros.