Les déclencheurs de base de données sont-ils une mauvaise idée?
D'après mon expérience, ils sont mauvais, car ils peuvent entraîner des effets secondaires surprenants et sont difficiles à déboguer (surtout lorsqu'un déclencheur en déclenche un autre). Souvent, les développeurs ne pensent même pas à chercher s'il y a un déclencheur.
D'un autre côté, il semble que si vous avez une logique qui doit se produire chaque fois qu'un nouveau FOO
est créé dans la base de données, alors l'endroit le plus infaillible pour le placer est un déclencheur d'insertion sur la table FOO.
La seule fois où nous utilisons des déclencheurs, c'est pour des choses vraiment simples comme la configuration du ModifiedDate
.
Réponses:
Les principaux problèmes liés aux déclencheurs sont
Cela signifie simplement qu'ils doivent être soigneusement utilisés pour les circonstances appropriées; qui, d'après mon expérience, se limite aux problèmes d'intégrité relationnelle (parfois avec une granularité plus fine que celle que vous pouvez obtenir de manière déclarative); et généralement pas à des fins commerciales ou transactionnelles. YMMV.
la source
Non, c'est en fait une bonne idée. S'il y a un problème avec vos déclencheurs spécifiques, alors vous ne les faites pas correctement, mais cela signifie généralement qu'il y a un problème avec votre implémentation, pas le concept des déclencheurs eux-mêmes :-).
Nous utilisons beaucoup les déclencheurs car ils placent l'activité spécifique au SGBD sous le contrôle de la base de données à laquelle elle appartient. Les utilisateurs d'un SGBD ne devraient pas avoir à se soucier de ce genre de choses. L'intégrité des données réside dans la base de données elle-même, et non dans les applications ou les utilisateurs qui l'utilisent. Sans contraintes, déclencheurs et autres fonctionnalités dans la base de données, il appartient aux applications d'appliquer les règles et il suffit d'une application / d'un utilisateur non autorisé ou bogué pour détruire les données.
Par exemple, sans déclencheurs, des choses aussi merveilleuses que les colonnes générées automatiquement n'existeraient pas et vous auriez à traiter une fonction sur chaque ligne lors de leur sélection. Cela risque de tuer les performances du SGBD, il est préférable de créer la colonne générée automatiquement au moment de l'insertion / de la mise à jour, car c'est la seule fois où elle change.
En outre, l'absence de déclencheurs empêcherait l'application de règles de données au SGBD, telles que les pré-déclencheurs, pour garantir que les colonnes ont un format spécifique. Notez que cela est différent des règles d'intégrité des données qui ne sont généralement que des recherches de clés étrangères.
la source
Les outils ne sont jamais mauvais. Les applications de ces outils peuvent être mauvaises.
la source
Je suis d'accord. Les problèmes avec les déclencheurs, ce sont les gens, pas les déclencheurs. Bien que ce soit plus à regarder, plus à considérer et augmente le fardeau des codeurs qui vérifient correctement les choses, nous ne supprimons pas les index pour nous simplifier la vie. (Les mauvais index peuvent être aussi mauvais que les mauvais déclencheurs)
L'importance des déclencheurs (dans mon esprit) est que ...
- Tout système doit toujours être dans un état valide
- Le code pour appliquer cet état valide doit être centralisé (pas écrit dans chaque SP)
Du point de vue de la maintenance, un déclencheur est très utile pour les codeurs concurrents et les problèmes pour les plus juniors / amateurs. Pourtant, ces personnes ont besoin d'apprendre et de grandir d'une manière ou d'une autre.
Je suppose que cela dépend de votre environnement de travail. Avez-vous des personnes fiables qui apprennent bien et qui sont méthodiques? Sinon, vous avez apparemment deux choix:
- Acceptez de perdre des fonctionnalités pour compenser
- Acceptez que vous ayez besoin de personnes différentes ou d'une meilleure formation et d'une meilleure gestion
Ils semblent durs, et je suppose qu'ils le sont. Mais c'est la vérité fondamentale, dans mon esprit ...
la source
Je pense que les déclencheurs ne sont pas seulement mauvais, mais nécessaires à une bonne conception de base de données. Les programmeurs d'applications pensent que les bases de données ne sont affectées que par leur application. Ils ont souvent tort. Si l'intégrité des données doit être préservée, quelle que soit l'origine du changement de données, les déclencheurs sont une exigence et il est insensé de les éviter car certains programmeurs sont trop ethnocentriques pour considérer que quelque chose d'autre que leur application prisée peut affecter les choses. Il n'est pas difficile de concevoir, de tester ou de dépanner un déclencheur si vous êtes un développeur de base de données compétent. Il n'est pas non plus difficile de déterminer qu'un déclencheur provoque un résultat inattendu s'il vous vient à l'esprit (comme à moi) d'y regarder. Si j'obtiens une erreur indiquant qu'une table que je ne référence pas dans mon sp a une erreur FK, Je sais sans même y penser que le déclencheur est à l'origine du problème, tout comme tout développeur de base de données compétent. Mettre des règles métier uniquement dans l'application est la principale cause que j'ai trouvée de mauvaises données car d'autres n'ont aucune idée que la règle existe même et la violent dans leurs processus. Les règles centrées sur les données appartiennent à la base de données et les déclencheurs sont essentiels pour appliquer les plus complexes.
la source
some programmers are too ethnocentric to consider that something other than their prized application may be affecting things
Surtout, oui.
La difficulté avec un déclencheur est qu'il fait des trucs "derrière votre dos"; le développeur qui maintient l'application pourrait facilement ne pas se rendre compte qu'elle est là et faire des changements qui gâchent les choses sans même s'en apercevoir.
Cela crée une couche de complexité qui ne fait qu'ajouter des travaux de maintenance.
Plutôt que d'utiliser un déclencheur, une procédure / routine stockée peut généralement être amenée à faire la même chose, mais de manière claire et maintenable - l'appel d'une routine stockée signifie que le développeur peut consulter son code source et voir exactement ce qui se passe.
la source
Les déclencheurs sont extrêmement puissants et utiles, il existe un certain nombre de scénarios où un déclencheur est la meilleure solution à un problème.
Ils sont également un très bon outil de "hack". Il existe souvent des situations dans lesquelles vous ne contrôlez pas immédiatement le code et la base de données. Si vous devez attendre 2 mois pour la prochaine version majeure de votre code, mais que vous pouvez appliquer un correctif à votre base de données immédiatement, vous pouvez mettre un déclencheur sur une table pour exécuter des fonctionnalités supplémentaires. Ensuite, lorsque la publication du code est possible, vous pouvez remplacer ce déclencheur par votre version codée de la même fonctionnalité si vous le souhaitez.
À la fin de la journée, tout est «mal» si vous ne savez pas ce que cela fait. Décider que les déclencheurs sont dus au fait qu'il y a des développeurs qui ne les comprennent pas équivaut à affirmer que les voitures sont mauvaises parce que certaines personnes ne peuvent pas conduire ...
la source
Les déclencheurs ont leurs utilisations - la journalisation / l'audit et le maintien d'une date de «dernière modification» sont deux très bonnes utilisations qui ont été mentionnées dans les réponses précédentes.
Cependant, l'un des principes fondamentaux d'une bonne conception est que les règles métier / la logique métier / tout ce que vous voulez appeler doivent être concentrés en un seul endroit. Mettre une partie de la logique dans la base de données (via des déclencheurs ou des procs stockés) et une partie dans l'application viole ce principe. La duplication de la logique dans les deux endroits est encore pire, car ils seront invariablement désynchronisés l'un avec l'autre.
Il y a aussi la question du «principe de la moindre surprise» qui a déjà été mentionnée.
la source
À un niveau élevé, il existe deux cas d'utilisation des déclencheurs1
1) Pour que les choses se produisent «automatiquement». Dans ce cas, les déclencheurs provoquent un effet secondaire, ils modifient les données d'une manière qui n'était pas attendue étant donné l'insertion, la mise à jour ou la suppression de l'opérateur (primitif) qui a été exécuté et a provoqué le déclenchement du déclencheur.
Le consensus général ici est que les déclencheurs sont effectivement nuisibles. Parce qu'ils modifient la sémantique bien connue d'une instruction INSERT, UPDATE ou DELETE. Changer la sémantique de ces trois opérateurs SQL primitifs mordra d'autres développeurs qui plus tard dans le futur auront besoin de travailler sur vos tables de base de données qui ne se comportent plus comme prévu lorsqu'elles sont utilisées avec les primitives SQL.
2) Pour appliquer des règles d'intégrité des données, autres que celles que nous pouvons traiter de manière déclarative (en utilisant CHECK, PRIMARY KEY, UNIQUE KEY et FOREIGN KEY). Dans ce cas d'utilisation, tout ce que font les déclencheurs est QUERY (SELECT) des données pour vérifier si la modification effectuée par INSERT / UPDATE / DELETE est autorisée ou non. Tout comme les contraintes déclaratives le font pour nous. Ce n'est que dans ce cas que nous (les développeurs) avons programmé l'application.
L'utilisation de déclencheurs pour ce dernier cas d'utilisation n'est pas nuisible.
Je blogue là-dessus à: http://harmfultriggers.blogspot.com
la source
Les déclencheurs sont un bon outil lorsqu'ils sont utilisés correctement. En particulier pour des choses comme l'audit des modifications, le remplissage de tableaux de synthèse, etc.
Maintenant, ils peuvent être «mauvais» si vous vous retrouvez dans «l'enfer de déclenchement» avec un déclencheur qui déclenche d'autres déclencheurs. J'ai travaillé une fois sur un produit COTS où ils avaient ce qu'ils appelaient des "déclencheurs flexibles". Ces déclencheurs ont été stockés dans une table car les piqûres SQL dynamiques sont compilées chaque exécution. Les déclencheurs compilés feraient une recherche et voir si cette table avait des déclencheurs flex à exécuter, puis compiler et exécuter le déclencheur «flex». En théorie, cela ressemblait à une idée vraiment cool car le produit était facilement personnalisé, mais la réalité était que la base de données avait explosé à cause de toutes les compilations qu'elle devait faire ...
Alors oui, ils sont super si vous gardez ce que vous faites en perspective. S'il s'agit de quelque chose d'assez simple comme l'audit, la synthèse, le séquençage automatique, etc., pas de problème. Gardez simplement à l'esprit le taux de croissance de la table et l'impact du déclencheur sur les performances.
la source
Je sais que les développeurs qui pensent que les déclencheurs devraient toujours être utilisés là où c'est le moyen le plus direct d'obtenir les fonctionnalités qu'ils souhaitent, et les développeurs qui ne le feront jamais. C'est presque un dogme entre les deux camps.
Cependant, je suis personnellement entièrement d'accord avec MarkR - vous pouvez (presque) toujours écrire du code fonctionnellement équivalent au déclencheur qui sera plus clair et donc plus facile à maintenir.
la source
Pas mal. Ils simplifient en fait des choses comme
Enregistrement / audit des modifications des enregistrements ou même des schémas de base de données
Vous pouvez avoir un déclencheur sur ALTER TABLE qui annule les modifications dans votre environnement de production. Cela devrait empêcher toute modification accidentelle de la table.
Application de l'intrgrité référentielle (relations de clé primaire / étrangère, etc.) sur plusieurs bases de données
la source
ALTER TABLE
.Non, ils ne sont pas méchants - ils sont juste mal compris :-D
Les déclencheurs ont une utilisation valable, mais beaucoup trop souvent comme un rétro-hack qui finit par aggraver les choses.
Si vous développez une base de données dans le cadre d'une application, la logique doit toujours être dans le code ou les sprocs effectuant l'appel. Les déclencheurs mèneront simplement à des problèmes de débogage plus tard.
Si vous comprenez comment le verrouillage, l'interblocage et la manière dont les bases de données accèdent aux fichiers sur disque, l'utilisation des déclencheurs de la bonne manière (par exemple l'audit ou l'archivage de l'accès direct aux bases de données) peut être très utile.
la source
Dire qu'ils sont mauvais est une exagération mais ils peuvent causer du maillage. Lorsque le déclenchement d'un déclencheur provoque le déclenchement d'autres déclencheurs, cela devient vraiment compliqué. Disons qu'ils sont gênants: http://www.oracle.com/technology/oramag/oracle/08-sep/o58asktom.html
Faire de la logique métier dans Oracle avec des déclencheurs est plus difficile qu'il n'y paraît en raison de problèmes de simultanéité multiple. Vous ne voyez pas les modifications dans une autre session tant que les autres sessions ne sont pas validées.
la source
Ils ne sont certainement pas mauvais. J'ai trouvé des déclencheurs précieux lors de la refactorisation des schémas de bases de données, lors du changement de nom d'une colonne, ou lors du fractionnement d'une colonne en deux colonnes ou vice-versa (exemple: cas nom / prénom) et lors de la transition.
Ils sont également très utiles pour l'audit.
la source
Cette réponse s'applique spécifiquement à SQL Server. (bien que cela puisse également s'appliquer à d'autres SGBDR, je n'en ai aucune idée. J'aurais préféré donner une réponse ici mais cela a été fermé comme une dupe.)
Un aspect qui n'a été mentionné dans aucune des réponses à ce jour est la sécurité. Parce que, par défaut, les déclencheurs s'exécutent dans le contexte de l'utilisateur qui exécute l'instruction qui provoque le déclenchement du déclencheur, cela peut entraîner une menace pour la sécurité à moins que tous les déclencheurs ne soient examinés.
L'exemple donné dans BOL sous l'en- tête « Gestion de la sécurité des déclencheurs » est celui d'un utilisateur qui crée un déclencheur contenant le code
GRANT CONTROL SERVER TO JohnDoe ;
afin d'élever ses propres autorisations.la source
S'il y a des effets secondaires, c'est un problème de conception. Dans certains systèmes de base de données, il n'y a pas d'autre possibilité de définir un champ d'auto-incrémentation, c'est-à-dire pour un champ d'ID de clé primaire.
la source
Je pense qu'ils peuvent être mauvais, mais seulement aussi mauvais que n'importe quoi d'autre dans le développement.
Bien que je n'ai pas vraiment beaucoup d'expérience avec eux, je les ai eu sur un projet récent sur lequel j'ai travaillé et qui m'a conduit à cette conclusion. Le problème que j'ai avec eux est qu'ils peuvent amener la logique métier à se retrouver à deux endroits, une bibliothèque de codes et une base de données.
Je le vois comme un argument similaire avec l'utilisation de sprocs. Vous aurez souvent des développeurs qui sont vraiment bons en SQL qui écrivent la logique métier dans la base de données, tandis que les personnes qui ne le sont pas auront leur logique métier ailleurs.
Ma règle d'or est donc de regarder quelle est la structure de votre projet. S'il semble viable de stocker la logique métier dans la base de données, il peut être utile d'avoir des déclencheurs.
la source
En effet, les déclencheurs sont souvent mal utilisés. En fait, dans la plupart des cas, vous n'en avez même pas besoin. Mais cela ne les rend pas nécessairement mauvais.
Un scénario qui me vient à l'esprit où les déclencheurs sont utiles est lorsque vous avez une application héritée pour laquelle vous n'avez pas le code source et qu'il n'y a aucun moyen de le changer.
la source
L'idée de déclencheurs n'est pas mauvaise, limiter l'imbrication des déclencheurs est mauvaise.
la source