Oracle
 sql >> Base de données >  >> RDS >> Oracle

Abandonner l'opération d'insertion/mise à jour dans le déclencheur à l'aide de PL/SQL

N'y allez pas.

ORA-04091: table XXXX is mutating est généralement un bon indicateur que ce que vous essayez de faire est trop complexe pour être fait de manière fiable avec déclencheurs.

Bien sûr, vous pouvez utiliser une variable de tableau de package et une poignée de déclencheurs ( euh !) pour contourner cette erreur, mais votre code sera très probablement :

  • être impossible à maintenir en raison de sa complexité et de la nature imprévisible des déclencheurs
  • ne répond pas bien à un environnement multi-utilisateurs

C'est pourquoi vous devriez repenser votre approche lorsque vous rencontrez cette erreur. Je vous conseille de construire un ensemble de procédures joliment regroupées dans un package pour gérer la cohérence inter-lignes. Révoquez tous les privilèges pour effectuer directement le DML sur la table et utilisez uniquement ces procédures pour la modifier.

Par exemple, votre procédure de mise à jour serait une procédure atomique processus qui :

  1. acquérir un verrou pour empêcher la mise à jour simultanée sur le même groupe de lignes (par exemple, verrouiller l'enregistrement de la chambre dans une application de réservation d'hôtel).
  2. vérifier que la ligne à insérer valide toute la logique métier
  3. créer tous les DML pertinents
  4. annule toutes ses modifications (et uniquement ses modifications -- pas l'ensemble de la transaction) en cas d'erreur (facile avec PL/SQL, il suffit de générer une erreur).