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

Comment éviter l'erreur ORA-04091 dans un déclencheur

Vous pourriez faire en sorte que la gâchette de A fasse quelque chose pour alerter la gâchette de B qu'elle n'a pas besoin de se déclencher. Il existe plusieurs souhaits pour configurer un état pour une session. L'approche la plus simple possible serait de faire quelque chose comme créer un package avec une variable booléenne bypass_checks_on_b que vous définissez sur TRUE avant de faire la UPDATE sur A, mis à FALSE une fois la UPDATE se termine, puis vérifiez l'état de cette variable dans votre déclencheur sur B avant de faire vos validations. Vous pouvez faire quelque chose de similaire avec une table temporaire ou un contexte plutôt que d'utiliser un package. Moins efficacement, vous pourriez potentiellement analyser la pile d'appels à l'intérieur de votre déclencheur sur B pour voir si le déclencheur sur A est dans la pile d'appels, mais cela aurait tendance à être plutôt moche.

Je serais très prudent à propos de toute cette architecture, cependant. Lorsque vous constatez que vous avez des déclencheurs sur A qui déclenchent des déclencheurs sur B qui voudraient interroger A, il est presque toujours vrai que vous avez mis beaucoup trop de logique dans les déclencheurs et que vous seriez bien mieux servi en déplaçant cette logique dans une couche de procédure stockée qui peut être appelée plutôt que les applications effectuant des insertions ou des mises à jour directes. Lorsque vous poussez trop de logique dans les déclencheurs, vous vous retrouvez avec un système très difficile à comprendre car il n'est pas évident, en regardant le code de l'application, quel type d'effets secondaires ont les différentes instructions. Et vous vous retrouvez avec un code très dynamique où vous avez de nombreux chemins à travers un seul morceau de code en fonction de l'appelant. Cela signifie presque certainement qu'il y aura des états que vous ne testez pas ou auxquels vous ne pensez pas où vous découvrirez que votre code fait quelque chose d'inattendu. Entre avoir une tonne d'états et avoir une base de code avec une tonne d'effets secondaires, vous pouvez très rapidement créer une base de code qui est essentiellement non maintenable.