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

PSQLException et problème de verrouillage lorsque le déclencheur est ajouté à la table

Problème intéressant. C'est ma meilleure supposition. Je n'ai rien testé.

D'une manière générale, la supposition éclairée de postgres sur l'effet que les déclarations auront sur les données ne s'étend pas à la logique de déclenchement. Lors de l'exécution de la deuxième instruction, postgres voit la contrainte de clé étrangère et sait qu'il doit vérifier si la valeur assignée (insérée) est valide, c'est-à-dire si elle représente une clé valide dans la table étrangère. Il est possible, malgré les mauvaises pratiques, que le déclencheur ait un effet sur la validité de la clé étrangère proposée (par exemple, si le déclencheur supprime des enregistrements).

(cas 1) S'il n'y a pas de déclencheur, il peut alors examiner les données (à la fois pré-commit et mises en scène pour la validation) et décider si la valeur proposée est garantie valide. (cas 2) S'il n'y a pas de contrainte FK, alors le déclencheur ne peut pas avoir d'impact sur la validité de l'insertion, elle est donc autorisée. (cas 3) Si vous omettez le detail_id=null , il n'y a pas de changement dans la mise à jour, donc le déclencheur ne se déclenchera pas, donc sa présence n'est pas pertinente.

J'essaie d'éviter autant que possible les contraintes FK et les déclencheurs. Il vaut mieux, à mon avis, laisser accidentellement la base de données contenir des données partiellement incorrectes que de la bloquer complètement, comme vous le voyez ici. Je supprimerais toutes les contraintes et déclencheurs FK, et forcerais toutes les opérations de mise à jour et d'insertion à fonctionner via des fonctions stockées, qui effectuent la validation à l'intérieur d'un verrou begin/commit, et géreraient les tentatives d'insertion/mise à jour incorrectes/invalides de manière appropriée et immédiate, plutôt que de forcer postgres à attendez que la commande 1 soit validée avant de décider si la commande 2 est autorisée.

Modifier : voir cette question

Modification 2 : La chose la plus proche que je puisse trouver de la documentation officielle sur le timing des déclencheurs par rapport à la vérification des contraintes est celle-ci du documentation sur les déclencheurs

C'est un peu flou, si le déclencheur qui se produit avant la vérification des contraintes s'applique à la vérification des contraintes d'autres transactions. Quoi qu'il en soit, ce problème est soit un bogue, soit mal documenté.