Scénario :
Chaque fois que les données sont insérées/mises à jour/supprimées dans/dans/dans une table, de multiples éléments de logique commerciale doivent être exécutés.
Question
Étant donné que la solution consiste à utiliser des déclencheurs de base de données, quelle option est la meilleure?:
1) un seul déclencheur par opération (insertion/mise à jour/Supprimer):
I_Table
- exécuté sur un insertU_Table
- exécuté sur une mise à jourD_Table
- exécuté sur une suppressionChaque déclencheur gérerait de multiples articles de logique commerciaux non liés.
OR
2) Plusieurs déclencheurs par opération séparés par la préoccupation:
I_Table_Logging
- Pour vous connecter à un insertI_Table_RI
- Pour appliquer l'intégrité référentielle sur un insertI_Table_BL
- Pour exécuter la logique commerciale sur un insertU_Table_Logging
- Pour vous connecter à une mise à jourU_Table_RI
- Pour appliquer une intégrité référentielle sur une mise à jourU_Table_BL
- pour exécuter la logique commerciale sur une mise à jourD_Table_Logging
- Pour vous connecter à une suppressionD_Table_RI
- pour appliquer l'intégrité référentielle sur une suppressionD_Table_BL
- pour exécuter la logique commerciale sur une SupprimerJe préfère l'option 2 car une seule unité de code a une seule préoccupation. Je ne suis pas un DBA et j'en connais assez sur SQL Server pour me rendre dangereux.
L'architecture et le schéma de la base de données ne doivent pas être changés. Il existe plusieurs endroits dans le schéma qui devrait être appliqué avec des relations explicites, mais malheureusement, ne peut pas être changée encore. C'est la raison pour laquelle je dois appliquer manuellement l'intégrité référentielle au lieu de s'appuyer sur une relation explicite.
Existe-t-il des raisons impérieuses de gérer toutes les préoccupations d'un seul déclencheur? Je suis spécifiquement préoccupé par la performance, l'ordre d'exécution et la restauration.
Ma préférence personnelle est de créer des déclencheurs par fonctionnalité, non par le fonctionnement DML. J'ai donc une vérification de manipulation pour insertion/mise à jour/Supprimer, une sorte de règlement commercial ou d'intégrité référentielle (encore une fois pour insertion/mise à jour/supprimer), une autre faire un piratage laids pour travailler autour du comportement indésirable dans notre logiciel client (éventuellement seulement pour insertion ou mise à jour), etc.
Garder chaque "comportement" au même endroit réduit les chances d'oublier de mettre à jour la logique qui a été dupliqué sur trois inserts distincts, mettez à jour et supprimer des déclencheurs.
Le plus gros piège avec des déclencheurs est que les tables insérées et supprimées ne sont pas indexées , et vous ne pouvez pas les indexer directement. En les rejoignant contre de grands ensembles de données performance horriblement et que les choses deviennent vraiment hors de la main lorsque vous avez de nombreux déclencheurs sur une table, en particulier lorsque la gâchette en cascade commence à entrer en jeu.
La plupart des déclencheurs que j'écris commencis en créant des variables de table @i et @D avec les colonnes à partir de l'inséré et supprimées qui seront nécessaires, ce qui leur permettra une clé primaire en cluster (car c'est le seul moyen de vous indexer une variable de table), puis de remplir les avec les données de l'insertion et supprimées.
J'ai écrit un article court (non commercial) sur les déclencheurs et couvre également quelques autres points.
http://dave.brittens.org/2012/03/29/witing-well-behaved-triggers/
Je ne peux pas trop insister sur cette question: les déclencheurs ne sont pas l'endroit idéal pour la logique des affaires!
Je n'utiliserais que des déclencheurs à des fins d'audit (par exemple, Dernières DateStamps mis à jour). Mettre la logique commerciale à l'intérieur des déclencheurs peut sembler une bonne idée au début, mais vous finirez probablement de vous tirer dessus dans le pied encore et encore à l'avenir. Les déclencheurs ont tendance à être oubliés et commenceront à interférer avec d'autres opérations en vrac que vous devrez peut-être effectuer à une date ultérieure. Temps et heure à nouveau, j'ai vu cela arriver, et j'ai entendu un pauvre DBA Hapless DBA "Gah! J'ai oublié tous ces déclencheurs !!"
Déplacez votre logique commerciale dans l'application, ou du moins dans des procédures stockées qui effectueront la manipulation des données. Les déclencheurs ne sont pas l'endroit pour cela. Utilisez des contraintes pour appliquer l'intégrité des données, pas des déclencheurs.