SQL Server table d'historique renseigner à travers le SP ou le Déclencheur?
Dans mon SQL Serveur backend pour mon application, je veux créer des tables d'historique pour un tas de mes tableaux, qui sera suivi d'un historique des modifications apportées aux lignes.
Toute mon application utilise des Procédures Stockées, il n'est pas embedded SQL.
La seule connexion à la base de données pour modifier ces tables seront par le biais de l'application et de la SP de l'interface.
Traditionnellement, les magasins qui j'ai travaillé ont effectué cette tâche à l'aide de déclencheurs.
Si j'ai le choix entre les Procédures Stockées et les Déclencheurs, ce qui est mieux?
Ce qui est plus rapide?
- Quel est le but? Si c'est une piste de vérification, les déclencheurs sont difficiles pour la capture de qui-quoi-quand info, surtout si il y a des changements multiples dans une transaction. Si c'est de la BR-liés, doit être dans le BR de la couche. Méfiez-vous des conseils de ceux qui ne savent pas ou se soucient de votre contexte.
- Peut-être que c'est parce que j'ai posé la question il y a si longtemps. Un problème majeur avec le soi, c'est qu'il a changé au fil du temps, et un certain nombre d'utilisateurs sont les seuls à réagir à la configuration actuelle. JMHO.
Vous devez vous connecter pour publier un commentaire.
Déclencheurs.
Nous avons écrit un GUI (interne appelé Rouge de Matrix Reloaded) pour faciliter la création/gestion de la journalisation d'audit des déclencheurs.
Voici quelques DDL de la substance utilisée:
La AuditLog table
Déclencheur journal insère
Déclencheur journal des Mises à jour
Déclencheur pour ouvrir une session Supprimer
Et pour savoir qui de l'utilisateur dans le logiciel fait la mise à jour, à chaque connexion "ouvre une session sur SQL Server" par l'appel d'une procédure stockée:
Notes
parfois le "OldValue" et "NewValue" les valeurs sont écrites en tant que sous-choisir - pour obtenir une chaîne explicite. c'est à dire"
OldValue: {233d-ad34234..}
NewValue: {883-sdf34...}
est moins utile dans la piste d'audit de:
Note finale: n'hésitez pas à ne pas faire ce que nous faisons. C'est génial pour nous, mais tout le monde est libre de ne pas l'utiliser.
AuditLog
script de table, et trois de vos journaux d'audit des déclencheurs, le script de la table que vous essayez de mettre à jour, le SQL, vous êtes en cours d'exécution à effectuer dans les insert/update/delete, l'erreur que vous obtenez dans une nouvelle question, et de le lier à partir d'ici.context_info
dans SQL server 2008, une nouvelle fonctionnalité appelée CDC (change data Capture) CDC sur le site MSDN peut vous aider.
CDC est une possibilité d'enregistrement des modifications apportées aux données de la table dans une autre table sans avoir à écrire des déclencheurs ou d'un autre mécanisme, capture de données modifiées enregistre les modifications comme insert, update, et delete pour une table dans SQL server ainsi, ce qui rend les détails des modifications disponibles dans un format relationnel.
Channel 9 vidéo
Nous disposons d'un outil tiers ApexSQL Audit que nous avons utilisé pour générer des déclencheurs.
Ici est de savoir comment les déclencheurs de ressembler à l'arrière-plan et la façon dont les données sont stockées. Espérons que les gars vont trouver cela utile suffisamment afin d'inverser le processus.
Son un peu différent de ce que Ian Boyd a montré dans ses exemples, car elle permet à chacune des colonnes doivent être vérifiés séparément.
Tableau 1 – contient les détails de la transaction (qui, quand, l'application, le nom d'hôte, etc)
Tableau 2 – titulaire d'avant/après les valeurs.
Déclencheur d'insertion
Je ne suis pas montrant des déclencheurs pour la mise à jour parce qu'ils sont assez long et ont la même logique que celle-ci.
Avertissement: je ne suis pas affilié avec l'Apex, mais en aucune façon je ne l'utilisation de leurs outils dans mon travail actuel.
Que tout le monde dit, les Déclencheurs. Ils sont plus faciles à unité de test et de beaucoup plus résistants pour les utilisateurs de puissance inattendus accéder directement aux tables aléatoires requêtes.
Comme pour les plus rapides? La détermination de ce qui est rapide à l'intérieur d'une base de données est un problème difficile, avec un grand nombre de variables. Court de "essayez les deux méthodes et de les comparer" vous n'allez pas pour obtenir une réponse utile à la méthode est plus rapide. Les variables comprennent la taille des tables impliquées, de la structure normale de mises à jour, la vitesse des disques dans le serveur, la quantité de mémoire, la quantité de mémoire consacré à la mise en cache, etc. Cette liste est sans fin et chaque variable affecte si les déclencheurs sont plus rapides que SQL personnalisée à l'intérieur de la SP.
Bon. Rapide. À bas prix. Choisissez deux. Les déclencheurs sont Bonnes en termes d'intégrité et probablement bon marché en termes de maintenance. Sans doute ils sont aussi Rapides qu'une fois qu'ils travaillent, vous avez terminé avec eux. SPs sont une question d'entretien et de pousser les choses dans l'entretien peut être Rapide, mais n'est jamais Bon ou bon marché.
Bonne Chance.
Approche recommandée dépend de vos besoins. Si la table d'historique est là pour de la piste d'audit, vous avez besoin pour capturer chaque opération. Si l'histoire de la table est seulement pour performance raisons, puis un planifiée de l'Agent SQL travail de transfert de données devrait être suffisant.
Pour la capture de chaque opération à l'utiliser APRÈS Déclencheurs ou de Capture de Données modifiées.
Après les déclencheurs de vous fournir avec deux tables temporaires pour fonctionner à l'intérieur de la gâchette:
Vous pouvez effectuer des insertions à la table d'historique à partir de ces tables temporaires et votre table d'historique sera toujours à jour. Vous pouvez ajouter un numéro de version, l'heure ou les deux à la table d'historique pour séparer la modification d'une seule source ligne.
De Capture de Données modifiées (CDC) est conçu pour la création d'un delta de table que vous pouvez utiliser comme une source de chargement des données dans un entrepôt de données (ou un tableau de l'historique). À la différence des déclencheurs, des CDC est asynchrone et vous pouvez utiliser n'importe quelle méthode et de programmation pour le remplissage de votre destination (sprocs, SSIS).
Vous pouvez accéder à la fois à des données originales et des changements avec les CDC. Le Suivi Des Modifications (CT) détecte uniquement les lignes modifiées. Il est possible de construire une piste de vérification complète des CDC, mais pas avec la CT. CDC et CT sont à la fois disponibles uniquement dans la MSSQL 2008 Enterprise edition et Developer edition.
Utiliser des déclencheurs pour cela. Cela signifie que toute modification, quelle que soit la source, seront prises en compte dans le tableau de l'historique. C'est bon pour la sécurité, résistant à des modes de défaillance comme les gens oublient d'ajouter du code pour mettre à jour la table d'historique et ainsi de suite.
Il n'est pas susceptible d'avoir aucune différence de vitesse en soit pour ce type de fonctionnement, comme le temps d'exécution sera dominé par les I/O.
Une question d'être très prudent à ce sujet est d'identifier votre cas d'utilisation de cette table, et assurez-vous qu'il est bien construit à cet effet.
Plus précisément, si c'est pour un opérationnel de la piste d'audit pour les intervenants, c'est assez différent de l'avant-et-après des instantanés de l'enregistrement des modifications dans les tables. (En fait, j'ai un moment difficile d'imaginer une bonne utilisation pour enregistrer les modifications, autres que le débogage.)
Une piste de vérification requiert en principe, au minimum, un id d'utilisateur, un timestamp, et un code d'opération - et probablement quelques détails sur le fonctionnement. Exemple - modifier la quantité commandée sur un point de la ligne sur un ordre d'achat.
Et pour ce type de piste d'audit vous ne pas souhaitez utiliser des déclencheurs. Le plus élevé dans le BR de la couche d'incorporer la génération de ces événements, le mieux.
Otoh, que, pour l'enregistrement des changements de niveau, les déclencheurs sont le droit de match. Mais c'est aussi souvent plus facile d'obtenir ce à partir de votre sgbd journalisation des fichiers.
Je préfère utiliser des déclencheurs pour la vérification des tables comme les déclencheurs peuvent prendre toutes les mises à jour, des insertions et des suppressions, et pas seulement les mises à jour, des insertions et des suppressions invoquée par certaines procédures stockées:
J'utilise sql server pour générer le code SQL de la révision des tables au lieu de codage à la main il. Ce code est disponible sur https://github.com/newdigate/sqlserver-revision-tables
Déclencheurs. Droit maintenant, vous pourriez être en mesure de dire que la seule manière de données est mis à jour par le biais de votre SPs, mais les choses peuvent changer, ou vous pourriez avoir besoin pour faire une masse d'insertion/mise à jour à l'aide de la SPs sera trop lourd pour. Aller avec des déclencheurs.
Il dépend de la nature de la demande et de la structure de la table, le nombre d'index, la taille des données, etc, les clés étrangères, etc. Si celles-ci sont relativement simples tables (pas ou peu d'indices comme des indices sur datetime/les colonnes de type entier) avec un ensemble limité de données (< 1 Million de lignes), vous serez probablement ok pour utiliser des déclencheurs.
Gardez à l'esprit que les déclencheurs peuvent être la source de problèmes de verrouillage. Je suppose que si vous utilisez les tables d'historique comme un type de piste de vérification vous sera d'indexation pour référence future. Si la lancer les mises à jour la table d'historique qui est lente à insert/update/delete en raison de l'index, la procédure d'appel se bloque jusqu'à ce que le déclencheur de finitions. Aussi, s'il y a des contraintes de clé étrangère qui sera mis à jour dans le déclencheur, cela pourrait aussi nuire à la performance.
Dans ce cas, tout dépend de la table d'index. Nous utilisons Sql Server 2000 pour un 24/7 application qui traite plus de 100 transactions financières par jour. La plus grande/principale table a plus de 100Million de lignes et de 15 index de masse (les suppressions ne sont pas raisonnablement possible de le faire si le temps de disponibilité est souhaitée). Même si tous les composants de SQL est fait dans des Procédures Stockées, nous ne pas utiliser des déclencheurs ou des clés étrangères en raison de l'impact sur les performances.
Déclencheurs. Voici ma démarche:
L'audit de cette manière continue à l'état actuel de la table source et toute l'histoire de la vérification de la table et facilement identifiable par les colonnes de clé.