tabla solucionar mutante error ejecución durante disparador compuestos compound 11g sql oracle plsql triggers mutating-table

sql - solucionar - ORACLE Después de la activación de la actualización: resolviendo el error de la tabla mutante ORA-04091



tabla mutante oracle (1)

Estoy tratando de crear un disparador:

create or replace trigger NAME_OF_TRIGGER after insert or update on table1 REFERENCING OLD AS OLD NEW AS NEW for each row

para completar automáticamente un par de campos no obligatorios al actualizar / insertar en una tabla.

Esto requiere que utilice un cursor que seleccione de la tabla 2 y también de la tabla 1 (el sujeto del desencadenante).

¿Hay alguna manera de evitar el error de tabla de mutación sin utilizar una tabla temporal para valores o una transacción autónoma?


"¿Hay alguna manera de evitar el error de tabla de mutación sin usar una tabla temporal para valores o una transacción autónoma?"

tl; dr no.

El error de tabla de mutación se debe a la consulta de la tabla que posee el desencadenante, o las tablas que están involucradas en una relación de clave externa con la tabla propietaria (al menos en versiones anteriores de la base de datos, no está seguro de si aún se obtiene).

En una aplicación diseñada correctamente, esto no debería ser necesario. Esta es la razón por la cual muchas personas consideran que las tablas de mutación son un indicador de modelos de datos deficientes. Por ejemplo, la mutación a menudo se asocia con una normalización insuficiente.

Parafraseando a Jamie Zawinski: Algunas personas, cuando se enfrentan a una excepción de mesa mutante, piensan: "Lo sé, usaré transacciones autónomas". Ahora ellos tienen dos problemas.

A veces, el error se puede evitar simplemente modificando los valores: NUEVOS en un desencadenante ANTES DE INSERTAR O ACTUALIZAR o mediante el uso de columnas virtuales. Pero tendrá que publicar más detalles para ver si se aplican.

Pero la mejor solución no es necesitar otro tipo.