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

J'ai un déclencheur autonome mais qui ne s'exécute qu'une seule fois dans la même session

Vous utilisez une transaction autonome pour contourner le fait qu'un déclencheur ne peut pas interroger lui-même sa table. Vous avez rencontré la tristement célèbre erreur de table de mutation et vous avez constaté que déclarer le déclencheur en tant que transaction autonome fait disparaître l'erreur.

Pas de chance pour vous cependant, cela ne résout pas du tout le problème :

  • Tout d'abord, toute logique de transaction est perdue. Vous ne pouvez pas annuler les modifications sur le suscription_fact table, ils sont engagés , tandis que votre transaction principale ne l'est pas et pourrait être annulée. Vous avez donc également perdu l'intégrité de vos données.
  • Le déclencheur ne peut pas voir la nouvelle ligne car la nouvelle ligne n'a pas encore été validée ! Étant donné que le déclencheur s'exécute dans une transaction indépendante, il ne peut pas voir les modifications non validées apportées par la transaction principale :vous obtiendrez des résultats complètement erronés.

C'est pourquoi vous ne devriez jamais faire de logique métier dans les transactions autonomes. (il existe des applications légitimes mais elles sont presque entièrement limitées à la journalisation/au débogage).

Dans votre cas, vous devez soit :

  1. Mettez à jour votre logique afin qu'elle n'ait pas besoin d'interroger votre table (mise à jour de suscription_fact uniquement si la nouvelle ligne est plus récente que l'ancienne valeur stockée dans id_date_unsuscription ).
  2. Oubliez l'utilisation de la logique métier dans les déclencheurs et utilisez une procédure qui met à jour correctement toutes les tables ou utilisez une vue, car nous avons ici un cas clair de données redondantes.
  3. Utilisez une solution de contournement qui fonctionne réellement (par Tom Kyte) .

Je vous conseille fortement d'utiliser (2) ici. N'utilisez pas de déclencheurs pour coder la logique métier. Ils sont difficiles à écrire sans bogues et encore plus difficiles à maintenir. L'utilisation d'une procédure garantit que tout le code pertinent est regroupé en un seul endroit (un package ou une procédure), facile à lire et à suivre et sans conséquences imprévues.