Question

J'ai entendu toutes sortes d'histoires d'horreur autour gremlins vivant dans les déclencheurs de base de données, et - pire -. Les systèmes étant amenés par l'ajout d'un élément déclencheur qui a provoqué une chaîne de cascade les

J'envisage la mise en œuvre d'une politique stricte sur l'utilisation des déclencheurs de base de données. Pour la séparation des préoccupations, la première pensée est-à-dire:

  

« déclencheurs de base de données doit être utilisé que dans le but de capturer et de maintenir la piste d'audit. »

  • Est-ce que quelqu'un a des politiques similaires?
  • Y a-t-il des arguments solides contre la politique telle?
Était-ce utile?

La solution

On dirait que nous détenons des vues similaires sur l'utilisation du déclencheur, mais je suis très intéressé d'entendre les opinions opposées d'autres CBM. Personnellement, je les considère comme un dernier recours et n'ont mis en œuvre des déclencheurs où il n'y a pas d'autre option. L'exception des déclencheurs INSTEAD OF sur des vues.

Les déclencheurs sont souvent la seule option lorsque vous améliorer une solution 3ème partie et les points d'extension ne sont pas exposés par l'API systèmes. Là où j'ai accès à la source, je ne l'ai pas encore rencontré une situation où un déclencheur a été ma première pensée.

Audit est un bon exemple. Dans une application 3ème partie, les déclencheurs peuvent être le seul choix. Si vous avez accès à la source, il est certainement pas la seule option, mais il peut être option la moins risquée / moins cher / plus facile (biffer la mention inutile). Si l'API de base de données est bien conçu, il y aura d'autres points d'entrée pour ajouter audit.

En dépit de mes réflexions sur les déclencheurs, je n'imposer la stricte politique que vous proposez. À mon avis, le DBA vs mentalité de développeur qui persiste dans de nombreuses organisations naît de la façon de ce type d'orientation est perçue. Essayez d'encourager la consultation, plutôt que d'imposer.

Autres conseils

Dans l'ensemble, les déclencheurs ont un impact silencieux et caché sur vos performances de modification des données.

J'ai vu des environnements où des erreurs en cascade ont été causés par la mise à jour d'autres tables dans un trigger et les tables mises à jour ont des déclencheurs.

En ce qui concerne auditting, un déclencheur peut être utilisé, mais si vous avez l'édition Enterprise de SQL Server 2008, ou plus tard, vous êtes également en mesure d'utiliser la fonctionnalité Modifier Data Capture (CDC). En utilisant la fonctionnalité CDC élimine la nécessité d'ajouter un élément déclencheur à la table auditted et supprime le risque d'un impact sur les performances cachées.

Je viens de la situation décrite ci-dessus par Mark

  

Les déclencheurs sont souvent la seule option lorsque vous améliorer une solution 3ème partie et les points d'extension ne sont pas exposés par l'API systèmes.

Mon exemple: une application c # écrit par un autre développeur utilisant LLBL.gen comme ORM. Toute modification de la structure de données que vous voulez que le code C # à l'utilisation implique la recompilation de l'ensemble de la structure de données et d'écrasement de la .dll précédente.
Il était plus facile d'ajouter la logique métier dans les déclencheurs d'appel que les procédures stockées recompilation et tester l'application. Le succès avec des déclencheurs implique généralement le « moins est plus » adage. Gardez l'utilisation au minimum et les remplacer par des appels de l'application lorsque cela est possible. Un autre avantage de mettre en œuvre une logique d'affaires du côté de la base de données est de ne pas avoir à descendre l'application Web lorsque des changements logiques.

Dans Oracle déclencheurs doivent être évités dans la plupart des situations parce qu'ils partagent une partie de la logique dans une zone de code distinct qui est plus difficile à déboguer et ne fonctionne que comme effet secondaire, pas directement.

exceptions légitimes comprennent au lieu de déclencheurs, l'intégration avec le code tiers et définir des valeurs par défaut complexes. Ce dernier peut être le plus grand argument pour l'utilisation de déclencheurs, mais si la logique métier est dans la base de données, alors il ne devrait pas être nécessaire.

La logique métier doit être en paquets et tous les accès de la table doit être fait à travers les paquets. Le paquet peut alors mettre en œuvre toute logique qui aurait été fait dans le déclencheur, y compris les valeurs par défaut complexes.

Si vous devez écrire un déclencheur au moins le faire appeler une procédure dans votre package logique métier de sorte que le code est plus découvrable et plus facile à déboguer / test.

Tom Kyte a diatribe contre les déclencheurs . En conclusion avec ceci:

  

Triggers devrait être l'exception et non la règle. Ils doivent être utilisés   que lorsque vous ne pouvez pas faire quelque chose d'une autre façon. Compte tenu de la concurrence   les questions, les problèmes liés à effectuer des opérations non transactionnelles en eux,   et les problèmes de maintenance, les déclencheurs sont quelque chose à utiliser avec parcimonie,   le cas échéant.

Le rapide et l'argument sale qui devrait se heurter à une telle politique est la mise en œuvre de la logique métier.

vérification Mundane du trafic de données est seulement une bonne utilisation des déclencheurs.

Le maintien de ces déclencheurs pour la logique métier rend l'utilisation des déclencheurs prennent une vie propre, comme si elle fait partie du cycle de vie du logiciel. Pour certaines bases de données comme Oracle, PostgreSQL et SQL Server, une telle utilisation des déclencheurs dans une arène conforme ACID ne doit jamais être supprimé ou relégué si la logique métier est mieux mis en œuvre dans la base de données.

D'autre part, un SGBD qui a des problèmes avec ACID la conformité dans les déclencheurs est MySQL. La langue de procédure stockée dans MySQL a une histoire rocheuse bien une mesure de succès de la mise en œuvre peut être atteint.

Se éloigner de toute base de données spécifique et de garder les choses en perspective:

Si l'intégrité référentielle doit être maintenue, laissez le moteur de stockage de la base de données le faire. Pourquoi une application devrait réinventer la roue de l'intégrité de la base de données dans le cadre de la logique métier? Que faire si une transaction (série d'instructions SQL) doit être annulée et les déclencheurs ont déjà tiré au large au milieu de la transaction? les informations de piste d'audit peut être enregistré qui a été annulée? Est-ce que le moteur de stockage permettent rollback pour les données de niveau de déclenchement? Aurez-vous de concevoir le rollback indépendant propose des paradigmes de la norme SQL? diligence raisonnable de la recherche sur ces sujets préciser si les déclencheurs sont une alternative saine.

S'il y a des opérations arithmétiques que vous pouvez effectuer dans un déclencheur qui ne ralentit pas le traitement de chaque ligne dans une table , puis déclencheurs sont OK.

S'il y a une massant de données que vous devez faire et que vous préférez avoir un déclencheur le faire au lieu de le code du navigateur (PHP, Python, Ruby, peu importe) que ne ralentit pas le traitement des chaque rangée dans une table , puis déclencheurs sont OK.

Conclusion

à mon humble avis, vous devez vous assurer que les pistes de vérification sont traités dans les transactions plutôt que dans les déclencheurs, car chaque enregistrement d'une ligne provoque intermittences de fonctionnement de base de données, en particulier lors du traitement en vrac ou dans un site victimes de trafic élevé. Les déclencheurs peuvent accomplir la logique métier dans beaucoup (mais pas tous) des situations.

Tout ce que j'ai jamais appris dit « jamais dire jamais ». Il y aura toujours des cas où vous devez aller à l'encontre d'une convention établie et il n'y a aucun moyen autour d'elle.

Souvent, il semble que ces situations sont causées par des anciens systèmes existants; des tiers; et l'architecture déjà en place. Bien que de meilleures solutions peuvent être claires et évidentes, le temps qu'il faut pour mettre en œuvre ces solutions est bien au-delà du temps disponible pour les réaliser (ou au-delà des ressources ou de l'autorité dans certains cas).

Alors, je vous conseille de - au mieux - il suffit de définir des lignes directrices générales. Peut-être quelque chose comme:

  

"déclencheurs de base de données devraient être utilisés uniquement dans le but de capturer et   maintenir la piste de vérification. Il faut prendre soin d'éviter l'utilisation des déclencheurs lorsque cela est possible. "

Ma politique est de ne pas utiliser les déclencheurs qui modifient les données. Les triggers qui ne modifient pas les données mais appliquent des règles d'intégrité qui ne peut pas être fait autrement avec des contraintes sont ok. Les déclencheurs sont des procédures justes et peuvent toujours être remplacées par d'autres procédures qui ne sont pas déclenchées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top