Oui, il est toujours mauvais de dépendre d'un comportement pg_trigger_depth()
Je suis peut-être un peu moins opposé aux déclarations générales, mais à quoi cela pourrait-il servir? Je ne vois aucun argument pour expliquer pourquoi vous souhaiteriez une telle fonctionnalité. Le but principal d'une base de données est d'assurer l'intégrité des données. Et pour autant que je puisse voir, et je peux me tromper, une telle utilisation est toujours une violation potentielle de l'intégrité des données. Dans la réponse de @ Erwin, il dit "si vous oubliez" . Le but de garantir l'intégrité est d'éliminer cette possibilité. Si un agent peut se souvenir de tout et comprendre les conséquences et le code qui les entoure, vous pouvez obtenir l'intégrité des données de tout .
Introduisons quelques termes, dans la programmation, nous avons
- "état" qui comprend tout ce à quoi un programmeur a accès.
- "contexte d'exécution" qui inclut l'environnement d'exécution.
Nous avons en outre un terme pour une fonction, qui n'a pas d'état que nous appelons une fonction pure ,
La fonction évalue toujours la même valeur de résultat pour les mêmes valeurs d'argument. La valeur de résultat de la fonction ne peut dépendre d'aucune information ou état caché susceptible de changer au cours de l'exécution du programme ou entre différentes exécutions du programme, ni de toute entrée externe des périphériques d'E / S (généralement - voir ci-dessous).
La distinction pour la pureté est utile car elle élimine toute charge de se souvenir de quoi que ce soit au nom de l'ordinateur ou du programmeur: f(x) = y
c'est toujours vrai. Ici, vous violez la pureté au pire endroit - la base de données. Et, vous le faites d'une manière complexe et sujette aux erreurs - faisant du contexte d'exécution interne une chose palpable dans l'état de votre application DB.
Je ne voudrais pas ça. Considérez simplement les complexités que vous devez tamponner mentalement.
Table A
les Trigger A
incendies
Trigger A
délivre toujours DML à Table B
, tir Trigger B
.
Trigger B
émet conditionnellement DML à Table A
, tir Trigger A
.
Trigger B
délivre toujours DML à Table A
, tir Trigger A
.
Trigger A
émet conditionnellement DML à Table B
, tir Trigger B
.
Trigger B
émet conditionnellement DML à Table A
, tir Trigger A
.
Trigger B
délivre toujours DML à Table A
, tir Trigger A
.
Si cela semble complexe, gardez à l'esprit que "conditionnellement", il peut être étendu à "cela s'est produit, mais cela ne se produit pas toujours" et "cela ne s'est pas produit, mais cela peut se produire ailleurs".
Pour pg_trigger_depth()
même être utile, vous devez avoir une série d'événements qui est tout aussi complexe. Et, maintenant, vous voulez que l'exécution dépende du contenu d'exécution dans cette chaîne?
J'éviterais ça. Si votre système de déclenchement est aussi complexe, vous jouez de la patate chaude avec une grenade à main dans un placard tout seul et il ne semble pas susceptible de bien se terminer.