152 votes

Vérifier 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 "changements à 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 en T-SQL. La façon dont j'ai l'intention de mettre en œuvre est ceci:

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 à l'aide de 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.

101voto

Jon Galloway Points 28243

Jetez un oeil à la somme de contrôle commande:

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM sample_table WITH (NOLOCK);

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)

30voto

BitLauncher Points 91

Malheureusement, CHECKSUM ne fonctionne pas toujours correctement pour détecter les modifications . Ce n'est qu'une somme de contrôle primitive et aucun calcul de CRC. Par conséquent, vous ne pouvez pas l'utiliser pour détecter tous les changements, par exemple, des changements symétriques entraînent le même CHECKSUM!

Par exemple. la solution avec CHECKSUM_AGG(BINARY_CHECKSUM(*)) fournit toujours 0 pour les 3 tables avec un contenu différent!

 
SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM 
(
  SELECT 1 as numA, 1 as numB
  UNION ALL
  SELECT 1 as numA, 1 as numB
)  q
-- delivers 0!

 

24voto

Nick Berardi Points 31361

Pourquoi ne voulez-vous pas utiliser de déclencheurs? Ils sont une bonne chose si vous les utilisez correctement. Si vous les utilisez comme moyen d'imposer l'intégrité référentielle, c'est quand ils passent du bon au mauvais. Mais si vous les utilisez pour la surveillance, ils ne sont pas vraiment considérés comme tabous.

20voto

Chris Miller Points 2552

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 l' CHECKSUM_AGG(BINARY_CHECKSUM(*)) méthode proposée par John, il va analyser chaque ligne de la table spécifiée. L' NOLOCK de l'indice 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 rangée de manière à ce que vous dites on 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.

18voto

caryden Points 4195

Malheureusement, je ne pense pas qu'il existe un moyen propre de le faire dans SQL2000. Si vous limitez vos exigences à SQL Server 2005 (et versions ultérieures), vous êtes en affaires. Vous pouvez utiliser le SQLDependency classe en System.Data.SqlClient . Voir Notifications de requête dans SQL Server (ADO.NET) .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X