Je sais que les déclencheurs peuvent être utilisés pour valider les données stockées pour que la base de données soit cohérente. Cependant, pourquoi ne pas exécuter la validation des données sur le côté de l'application avant de les stocker dans la base de données?
Par exemple, nous stockons des clients et nous souhaitons effectuer une certaine validation qui ne peut pas être facilement effectuée sur le niveau DDL. https://severalnines.com/blog/postgresql-Triggers-and-SttorReocer-Basics
Un autre exemple est l'audit.
Comment les déclencheurs et la transaction de base de données fonctionnent ensemble. Par exemple, si je voudrais effectuer une validation des données insérées. Cela se fait à l'intérieur d'une transaction. Que se passe-t-il plus tôt: la transaction est engagée ou la gâchette est exécutée?
Cela dépend du type de système d'application que vous construisez:
si vous créez un système centrée sur l'application qui contient une seule application principale, avec une base de données dédiée spécifiquement pour cette application, et idéalement une équipe responsable de l'évolution de l'application et de la base de données côte à côte, vous pouvez conserver toute la logique de validation et également audit. logique à l'intérieur de l'application.
Le principal avantage est que vous n'avez pas à distribuer la logique commerciale entre application et dB, la maintenance et l'évolution du système deviennent souvent plus faciles. En tant que bonus, vous ne liez pas trop l'application sur un type spécifique de fournisseur de SGBD ou de DBMS. Cette approche est évidemment requise si votre demande souhaite pouvoir utiliser un système de DB léger qui ne fournit pas de déclencheurs.
Si, toutefois, vous créez un système dans lequel de nombreuses applications différentes partagent une base de données commune et ne peuvent pas envisager à l'avance quelles applications l'écriront à l'avenir, ou quelles équipes développeront des applications de remplissage de données dans la DB à l'avenir, puis est préférable que votre base de données sera responsable de la garantie autant de cohérence des données que possible. Et c'est là que les déclencheurs deviennent vraiment utiles. Dans les systèmes plus importants, les contraintes de référence ne suffisent souvent pas pour cela, mais un déclencheur qui appelle une procédure stockée peut mettre en œuvre presque tout type de validation dont vous avez besoin.
Une autre raison d'utiliser des déclencheurs peut être une performance: dans des modèles de données complexes, il n'est pas rare de rencontrer des règles de cohérence complexes nécessitant de nombreuses données supplémentaires qui ne font pas partie de l'ensemble de travail actuel disponible sur l'application client. Transférer toutes ces données sur le réseau d'abord pour que la validation possible au client peut avoir un impact de performance notable.
Voir aussi cet ancien poste SE: Application logique VS DB déclenchers pour le nettoyage de la base de données
Donc, décidez pour vous quel type de système vous construisez, vous pouvez alors faire une décision fondée si des déclencheurs sont le bon outil pour votre cas ou non.
Je pense que la question concerne la responsabilité de la qualité des données.
La réponse dépend de la façon dont vous voyez le système.
Si vous voyez la base de données en tant que service indépendant, distinct et autonome distinct de l'application, la base de données est chargée de garantir la cohérence et la qualité des données qu'il contient. Essentiellement parce que cette base de données pourrait être utilisée par une autre application, elle ne peut donc pas compter sur cette deuxième application ayant les mêmes comportements de cohérence et de qualité. Dans ces circonstances, la base de données doit être conçue pour exposer une API et un comportement autonome. Dans cet affichage, il existe au moins deux applications, l'une d'entre elles est la base de données et l'autre est l'application à l'aide de celle-ci.
À l'inverse, la base de données pourrait être considérée comme une forme compliquée de fichier sous le contrôle direct et total de l'application. Dans ce sens, la base de données évolue d'être un outil pur sérialisation et de navigation de documents. Il peut fournir des comportements avancés pour supporter la requête et la maintenance de documents (comme JSON ou les outils XML), mais à nouveau, il n'est pas nécessaire (comme la plupart des flux de fichiers). Dans ce cas, il est purement responsable des programmes de maintenir le format et le contenu corrects dans le fichier. Dans ce point de vue, il y a une application.
Dans les deux points de vue, la question suivante est de savoir comment prendre en charge l'utilisation de la base de données comme un fichier fantaisie ou un service séparé. Vous pourriez y parvenir par:
Chacun vient avec ses propres avantages/contre et dépendra des contraintes architecturales de l'environnement que le système fonctionne dans.
Indépendamment de quelle vue vous prenez, cela paie toujours pour valider les données à des limites.
Quelle validation est justifiée à chaque frontière dépend de la manière dont il est risqué de ne pas la valider.
Non, vous ne devez jamais utiliser de déclencheurs pour faire de la validation.
La base de données n'est responsable que de sa propre intégrité. Toute validation confrontée à l'utilisateur doit être effectuée par votre application.
Les bases de données effectuent trois niveaux de validation pour l'intégrité. Le premier est la validation du niveau de champ. Un champ peut être nécessaire, s'il n'y a pas de valeur (null), c'est une erreur. Cela peut également être une contrainte de contrôle; Un domaine a un nombre énuméré de valeurs.
Deuxièmement, il y a des relations entre les tables. Dans une table, vous stockez une ou plusieurs clés étrangères, relatives à cette table à d'autres tables et nécessitant les valeurs d'être des clés valides pour "autre table". Pensez à une base de données d'adresse, où nous soutenons les adresses de différents pays. Une clé de pays dans une adresse doit indiquer un pays connu. Si les données (par exemple, un code postal) est valide, ce n'est pas une préoccupation de cette vérification d'intégrité.
Troisièmement et les plus compliqués sont des déclencheurs. En règle générale, celles-ci devraient aborder (le jeu de mots non destiné) concernent des règles d'intégrité qui sont conditionnelles. Pour revenir à l'adresse de l'adresse: si un pays n'a pas de codes postaux, ce serait un problème si un pays de cette liste aurait un code postal. Donc, la vérification serait la suivante: Si ce pays n'a pas de codes postaux, le champ Code postal doit être null.
La validation est la préoccupation de la demande. Le fait qu'un code postal allemand consiste en seulement des chiffres est un chèque que l'application doit apporter, pas la base de données. La ligne est une mince, vous pourriez peut-être avoir besoin de penser/discuter dans certains cas si quelque chose doit être dans une gâchette (protéger l'intégrité de votre base de données) ou dans l'application (Validation de l'utilisateur confronté).
L'audit est un exemple classique d'utilisation efficacement des déclencheurs. J'ai trouvé des erreurs faites par le testeur (déplacement d'un client d'un niveau de service à un autre) grâce à une table d'audit mise en œuvre par des déclencheurs. Je recommande vivement d'utiliser des déclencheurs pour l'audit.
Validation pourrait être fait au niveau de l'extrémité avant, mais j'ai vu des erreurs étranges dans la base de données que j'ai manipulée (personnes nées dans 3000, etc.), et que certaines d'entre elles, je me suis fait Je recommande fortement d'avoir une couche supplémentaire de validation dans la base de données, au cas où. Bien entendu, ces types d'erreurs pourraient être évités avec les contraintes de chèques et plusieurs fois, elles sont plus efficaces (dans MS SQL, ils sont la méthode préférée; toujours vérifier la documentation).
Parce que la question est de savoir si nous avons vraiment besoin de déclencheurs pour des bases de données relationnelles ici, voici quelques autres cas d'utilisation où utiliser des déclencheurs:
instead of
. Avec cette moyenne, on peut insérer, mettre à jour et supprimer des entrées d'une vue. Les déclencheurs peuvent diffuser ces actions sur plusieurs tables. C'est un moyen de faire une vue restreinte disponible sans exposer les détails des tables sous-jacentes.En tant que logique commerciale de l'inconvénient, la logique est distribuée entre les couches et il s'agit d'un inconvénient majeur pour la maintenance. Comme un autre auteur écrit, il s'agit d'une limite mince entre l'application et la base de données et le choix n'est pas toujours clair. Mon opinion personnelle est que les déclencheurs placent un fardeau sur les développeurs. Ils peuvent gagner du temps au développement. Ils améliorent définitivement l'expiration de l'utilisateur car ils stimulent les performances sur des connexions réseau lentes.