sql >> Base de Datos >  >> RDS >> Oracle

Cancelar la operación de inserción/actualización en el disparador usando PL/SQL

No vayas allí.

ORA-04091: table XXXX is mutating es generalmente un buen indicador de que lo que sea que esté tratando de hacer es demasiado complejo para hacerlo confiablemente con gatillos.

Claro, podría usar una variable de matriz de paquetes y un puñado de disparadores ( ¡uf!) para sortear este error, pero lo más probable es que su código:

  • ser imposible de mantener debido a su complejidad y la naturaleza impredecible de los disparadores
  • no responde bien a un entorno multiusuario

Es por eso que debe repensar su enfoque cuando encuentre este error. Le aconsejo que construya un conjunto de procedimientos bien agrupados en un paquete para lidiar con la consistencia entre filas. Revoque todos los privilegios para hacer DML en la tabla directamente y use solo esos procedimientos para modificarla.

Por ejemplo, su procedimiento de actualización sería un atómico proceso que:

  1. adquirir un bloqueo para evitar la actualización simultánea en el mismo grupo de filas (por ejemplo, bloquear el registro de la habitación en una aplicación de reserva de hotel).
  2. verifique que la fila que se insertará valide toda la lógica comercial
  3. hacer todos los DML relevantes
  4. revierte todos sus cambios (y solo sus cambios, no toda la transacción) en caso de error (fácil con PL/SQL, solo genere un error).