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

Déclencheur ORACLE après mise à jour :résolution de l'erreur de table de mutation ORA-04091

"Existe-t-il un moyen d'éviter l'erreur de table en mutation sans utiliser une table temporaire pour les valeurs ou une transaction autonome ?"

tl;dr non.

L'erreur de table en mutation est causée par l'interrogation de la table qui possède le déclencheur, ou des tables qui sont impliquées dans une relation de clé étrangère avec la table propriétaire (au moins dans les anciennes versions de la base de données, pas sûr qu'elle soit toujours obtenue).

Dans une application correctement conçue, cela ne devrait pas être nécessaire. C'est pourquoi de nombreuses personnes considèrent les tables en mutation comme un indicateur d'une mauvaise modélisation des données. Par exemple, la mutation est souvent associée à une normalisation insuffisante.

Pour paraphraser Jamie Zawinski :certaines personnes, lorsqu'elles sont confrontées à une exception de table en mutation, pensent "je sais, je vais utiliser des transactions autonomes". Maintenant, ils ont deux problèmes.

Parfois, l'erreur peut être évitée en modifiant simplement les valeurs :NEW dans un déclencheur BEFORE INSERT OR UPDATE ou en utilisant des colonnes virtuelles. Mais vous devrez publier plus de détails pour voir si ceux-ci s'appliquent.

Mais la meilleure solution consiste à ne pas avoir besoin d'un autre type.