Vérifiez les modifications apportées à une table SQL Server?
Comment puis-je surveiller une base de données SQL Server pour que les modifications d'une table, sans l'aide de déclencheurs ou de la modification de la structure de la base de données d'une façon quelconque? Mon préféré environnement de programmation est .NET et C#.
J'aimerais être capable de supporter tous les SQL Server 2000 SP4 ou plus récent. Ma demande est un boulon sur la visualisation des données pour un autre produit d'une entreprise. Notre base de clients est dans les milliers, donc je ne veux pas avoir à mettre dans les exigences que l'on modifie le fournisseur tiers du tableau à chaque installation.
Par "modifications apportées à une table" je veux dire des modifications aux données de table, pas de changements à la structure de la table.
En fin de compte, je voudrais le changer pour déclencher un événement dans mon application, au lieu d'avoir à rechercher les modifications sur un intervalle.
Le meilleur cours de l'action compte tenu de mes besoins (pas de déclencheurs ou de modification de schéma, SQL Server 2000 et 2005) semble être d'utiliser le BINARY_CHECKSUM
fonction dans T-SQL. La façon dont j'ai l'intention de mettre en œuvre est: est-ce
Toutes les X secondes d'exécuter la requête suivante:
SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
FROM sample_table
WITH (NOLOCK);
Et de la comparer à l'encontre de la valeur stockée. Si la valeur a changé, passer par le tableau ligne par ligne, en utilisant la requête:
SELECT row_id, BINARY_CHECKSUM(*)
FROM sample_table
WITH (NOLOCK);
Et de comparer les sommes retournés à l'encontre des valeurs stockées.
- Ils n'arrivent pas à mettre de dernière modification d'horodatage sur leurs lignes, ont-ils?
Vous devez vous connecter pour publier un commentaire.
Prendre un coup d'oeil à la somme de contrôle commande:
Qui sera de retour le même nombre à chaque fois qu'il est exécuté tant que le contenu de la table n'ont pas changé. Voir mon post sur ce pour plus d'informations:
Somme de contrôle
Voici comment je l'ai utilisé pour reconstruire les dépendances de cache lorsque les tables changé:
ASP.NET 1.1 la base de données de la dépendance de cache (sans déclencheurs)
Malheureusement, la somme de contrôle ne fonctionne pas toujours correctement afin de détecter les modifications.
C'est seulement une primitive de la somme de contrôle et pas de contrôle de redondance cyclique (CRC) de calcul.
Par conséquent, vous ne pouvez pas l'utiliser pour détecter tous les changements, e. g. symétrique à la suite des changements dans la même somme!
E. g. la solution avec
CHECKSUM_AGG(BINARY_CHECKSUM(*))
sera toujours 0 pour tous les 3 tables avec un contenu différent:Pourquoi ne voulez-vous pas utiliser des déclencheurs? Ils sont une bonne chose si vous les utilisez correctement. Si vous les utilisez comme un moyen d'appliquer l'intégrité référentielle qui est quand ils vont de bon à mauvais. Mais si vous les utilisez pour la surveillance, ils ne sont pas vraiment considérés comme tabous.
Combien de fois avez-vous besoin pour vérifier les changements et de la taille (en termes de taille de ligne) sont les tables de la base de données? Si vous utilisez le
CHECKSUM_AGG(BINARY_CHECKSUM(*))
méthode proposée par John, il va analyser chaque ligne de la table spécifiée. LeNOLOCK
soupçon aide, mais sur une grande base de données, vous êtes toujours frapper à chaque ligne. Vous aurez également besoin de stocker la somme de contrôle pour chaque ligne de sorte que vous dire a changé.Avez-vous pensé à y aller à ce à partir d'un angle différent? Si vous ne souhaitez pas modifier le schéma pour ajouter des déclencheurs, (ce qui fait sens, ce n'est pas votre base de données), avez-vous pensé à travailler avec le fournisseur de l'application qui fait la base de données?
Ils pourraient mettre en œuvre une API qui fournit un mécanisme de notification des accessoire les apps de données a changé. Il pourrait être aussi simple que la rédaction d'un tableau de communication que les listes de ce tableau ainsi que les lignes qui ont été modifiées. Qui pourraient être mises en œuvre par le biais de déclencheurs ou de l'application du code. De votre côté, ti n'a pas d'importance, votre seule préoccupation sera de la numérisation de la notification de la table, sur une base périodique. Les performances sur la base de données serait beaucoup moins que l'analyse de chaque ligne pour les changements.
La partie la plus difficile serait de convaincre le fournisseur de l'application pour mettre en œuvre cette fonctionnalité. Puisque cela peut être gère entièrement par le biais de SQL via des déclencheurs, vous pouvez faire le gros du travail pour eux par l'écriture et le test de la déclenche et ensuite mettre le code pour le fournisseur de l'application. En ayant le soutien aux fournisseurs les déclencheurs, c'éviter la situation où l'ajout d'un déclenchement par inadvertance remplace un déclencheur fournis par le vendeur.
Malheureusement, je ne pense pas qu'il y est un moyen propre pour ce faire, dans SQL2000. Si vous limitez vos exigences pour SQL Server 2005 (et plus tard), alors vous êtes dans les affaires. Vous pouvez utiliser le
SQLDependency
classe dansSystem.Data.SqlClient
. Voir Les Notifications de requête dans SQL Server (ADO.NET).Ont un travail DTS (ou un travail qui est démarré par un service windows) qui s'exécute à un intervalle donné. Chaque fois qu'il est exécuté, il obtient des informations sur le tableau donné en utilisant le système de INFORMATION_SCHEMA tables, et enregistre ces données dans le référentiel de données. Comparer les données renvoyées au sujet de la structure de la table avec les données renvoyées à la fois précédente. Si elle est différente, alors vous savez que la structure a changé.
Exemple de requête pour renvoyer des informations concernant toutes les colonnes dans la table de l'ABC (idéalement liste juste les colonnes de la table INFORMATION_SCHEMA que vous voulez, au lieu d'utiliser *sélectionnez ** comme je le fais ici):
Vous surveillez les différentes colonnes et les vues INFORMATION_SCHEMA selon exactement comment vous définissez "modifications apportées à une table".
Je devine ici: Si vous ne voulez pas modifier le tiers des tables, vous Pouvez créer une vue et ensuite mettre un trigger sur ce point de vue?
Vérifier le dernier commit date. Chaque base de données possède une histoire où chaque commit est fait. Je crois que c'est une norme de l'ACIDE de la conformité.