Comment savez-vous si une table SQL a été changé depuis la dernière fois que vous l'avez utilisé?
Est-il un moyen de savoir si les données dans un Serveur SQL server 2008 R2 tableau a changé depuis la dernière fois que vous l'avez utilisé? Je voudrais savoir de n'importe quel type de changement -- que ce soit un nouveau record a été inséré ou un existant a été modifié ou supprimé.
Je ne suis pas intéressé à ce que le changement aurait pu être. Je suis seulement intéressé par une valeur booléenne qui indique si oui ou non les données de la table a été modifiée.
Enfin, je veux une solution simple qui ne nécessite pas de l'écriture d'un déclencheur pour chaque opération CRUD et alors que le déclencheur de mise à jour de certains autres journaux de la table.
J'ai le C# programme qui vise à insérer une grande quantité de données initiales dans certains tables de base de données. C'est une opération qui est censé se produire une seule fois ou, plus rarement, jamais, si jamais, dans la vie de l'application. Cependant, au cours du développement et de test, bien que, nous utilisons ce programme beaucoup.
Actuellement, avec plus de 10 tables qu'il insère des données dans, chacun ayant environ 21 000 lignes par table, le programme prend environ 45 secondes pour s'exécuter. Ce n'est pas vraiment un énorme problème, car c'est une opération ponctuelle qui est de toute façon va être fait à l'interne avant l'expédition du produit au client.
Encore, je tiens à minimiser ce temps. Donc, je veux pas insérer des données dans une table, si il n'y a eu aucun changement dans les données de la table depuis mon dernier programme utilisé.
Mon collègue m'a dit que je pouvais utiliser le CHECKSUM_AGG
fonction en T-SQL. Ma question(s) sont les suivants:
1) Si je calcule l' CHECKSUM_AGG(Cast(NumericPrimaryKeyIdColumn AS int))
, alors la somme de contrôle ne change qu'une nouvelle ligne a été ajoutée ou un existant supprimé, non? Si quelqu'un a seulement modifié les valeurs des autres colonnes d'une ligne existante dans la table, qui n'aura pas d'impact sur la somme de contrôle total de la colonne ID, droit? Ou sera-ce?
2) Est-il un autre moyen pour que je puisse résoudre le problème de savoir si les données de la table a changé depuis la dernière fois que mon programme?
C'est certainement une option à penser. Merci. Même si je ne suis pas sûr si mon client me permettra de le faire.
comment combat ajouter un rowversion dans vos colonnes? ligne version incrémente automatiquement après une mise à jour, modifier, supprimer et ajouter dans votre base de données assurez-vous juste d'avoir une autre colonne ou de table qui enregistre la dernière valeur de votre rowversions de sorte que vous pouvez suivre les modifications/les fichiers qui ont été modifiés.
OriginalL'auteur Water Cooler v2 | 2013-11-18
Vous devez vous connecter pour publier un commentaire.
Avez-vous étudié La Capture De Données Modifiées?
OriginalL'auteur Edmund Schweppe
Ce qui est très proche de ce que j'avais déjà à l'esprit et ce @user3003007 mentionné.
Un sens, je pense est de prendre un
CHECKSUM(*)
ouCHECKSUM(Columns, I, Am, Interested, In)
pour chaque tableau, puis faire un total de somme de contrôle sur la somme de chaque ligne, comme ceci:Ce n'est pas encore une méthode fiable que la somme de contrôle ne fonctionne pas sur certains types de données. Donc, si j'ai ma colonne de type
text
ountext
, la somme de contrôle échoue.Heureusement pour moi, je n'ai pas ces types de données dans la liste de colonnes, je suis intéressé, si cela fonctionne pour moi.
OriginalL'auteur Water Cooler v2
Vous pouvez utiliser une combinaison de fonctions de hachage et de checksum_agg. Ci-dessous fonctionneront tant que la chaîne de valeurs de dépassement de la HASHBYTES fonction. Il fonctionne en convertissant toutes les colonnes à cordes, la concaténation de ces, le hachage de la chaîne concaténée, tournant le hachage en entier, le fait de placer toutes ces valeurs dans une table temporaire, puis de l'exécution des checksum_agg sur la table temp. Pourrait facilement être adaptée à itérer à travers toutes les vraies tables
Edit: en Combinant MD5 et checksum_agg dirait qu'il travaille au moins pour un peu étroit tables:
OriginalL'auteur user3003007
Comment savez-vous que le changement a été fait par vous, ou que la modification est pertinente à vos besoins? Si vous n'allez pas le faire correctement (supprimer & re-insérer ou de fusion), puis la chose entière semble futile pour moi.
Dans tous les cas, si vous passez seulement une heure de recherche, la mise en œuvre et le test de votre changement, vous devez l'exécuter à 80 fois (et de s'asseoir et de regarder) avant d'avoir brisé même sur votre temps. Pourquoi s'embêter?
OriginalL'auteur LoztInSpace
l'opération ).
Aucun type de problème .
OriginalL'auteur KumarHarsh
Un moyen facile de vérifier cela est d'utiliser le système de Dmv à vérifier l'indice de statistiques d'utilisation, le premier indice sur la table (id 1) est soit le segment ou l'index cluster de la table elle-même et peut donc être utilisé pour la vérification lors de la dernière mise à jour de produit:
De cela, vous pouvez voir la dernière fois que le tableau a été mis à jour ainsi que le nombre de mises à jour il y a eu (je l'ai laissé dans la recherche et analyse etc seulement dans le cas où vous êtes intéressé).
Il vaut la peine de prendre note que ces données ne sont pas conservées après un redémarrage, mais il est assez simple de le charger dans une table permanente chaque maintenant et puis dans afin de rendre les données permanente.
OriginalL'auteur steoleary