9 Réponses :


3
votes

donné qu'il n'y a pas encore de réponses, voici mes 2 cents:

  • Pour insertion, j'utiliserais un champ DateTime avec Valeur par défaut GetDate ()
  • Pour la mise à jour, j'utiliserais également un champ DateTime modifié par déclencheur chaque fois qu'il y a une mise à jour.
  • Pour Supprimer, l'enregistrement ne sera pas disponible, vous ne pouvez donc pas la demander.

    J'ai pensé à utiliser des horodatages pour des déclencheurs à l'aversion, mais vous ne pouvez pas convertir l'horodatage en DateTime.

    EDIT: Ou peut-être pouvez-vous utiliser une "métavère" où dans les déclencheurs, vous sauverrez les dates de modification xxx

    J'espère que ce sera utile


2 commentaires

Veillez simplement à bloquer. Si vous avez quelques transactions fonctionnant en même temps qui modifient la même table (différentes lignes qui ne causeraient pas de blocage), elles devront attendre leur tour pour mettre à jour la ligne de table de journal pour cette table.


Ouais, vous avez raison, pourriez-vous modifier le code afin qu'il reflète les modifications que vous avez mentionnées? Je ne serai pas dérangé pour ça



1
votes

sans déclencheurs: vous pouvez avoir une colonne de LastCHGDate sur la table et la définir lorsque vous insérez / mettez à jour / supprimer une ligne. Vous devez "supprimer" par UsIgR une colonne d'état définie sur "D" ou quelque chose comme ça. Mettez un index sur cette colonne et sélectionnez le max () à voir lorsqu'un changement a été effectué.


2 commentaires

Juste pour être clair, LastCHGDate serait un type DateTime et vous auriez besoin de la définir sur GetDate () sur chaque insertion / mise à jour. De plus, "Supprimer" serait traité comme une mise à jour avec un changement d'état de "D" et pourrait ensuite être interrogé pour le dernier temps de changement.


Aller en arrière entre une table de rondins et la colonne DateTime dans la table actuelle semble encombrante



1
votes

Eh bien, vous pouvez garder une colonne avec un "LastUpDatedate" défini sur la date / heure du serveur actuel sur n'importe quel insert ou mise à jour. Ensuite, vous pouvez simplement interroger pour la ligne avec le dernier lâchement lâblé.


0 commentaires

6
votes

Comme les deux réponses précédentes montrent, il n'y a vraiment aucune fonctionnalité intégrée dans SQL Server qui est facilement disponible pour vos besoins.

Il existe une tonne de vues de gestion dynamique qui peuvent vous dire certains de vos points d'intérêt, par exemple. sys.dm_db_index_usage_stats qui vous indique quand un index donné a eu sa dernière recherche ou mise à jour.

Mais il n'y a vraiment rien dans la boîte en soi que vous pourriez tirer parti de toutes les informations que vous recherchez - vous devez vraiment le faire vous-même, ajout de par exemple. champs DateTime à vos tables et les remplir de déclencheurs.

Désolé, je ne peux pas vous donner de meilleures nouvelles - c'est comme ça que c'est pour l'instant.

Dans SQL Server 2008, vous disposez de nouvelles fonctionnalités supplémentaires, ce qui pourrait couvrir certaines de vos exigences - Vérifier:


0 commentaires

2
votes

sur des périodes courtes (depuis la démarrage du serveur), vous cochez que vous vérifiez sys.dm_db_index_usage_stats Last_user_update colonne . Mais comme cela ne compte que des mises à jour depuis la démarrage du serveur, elle ne peut pas être utilisée sur une longue période.

Pour de longues périodes, si la table n'est pas énorme, votre application peut stocker la table checksum_agg (tout) . Vous n'avez besoin que de la reconduire une fois, au démarrage de l'application, et comparez-la avec la valeur précédemment stockée. En outre, l'application peut détecter les modifications à l'aide du DMV. Lors de l'arrêt de l'application, il devrait stocker la checksum de la table actuelle.


0 commentaires

0
votes

simple! Ajoutez d'abord une colonne "LastUpdatedated". Donnez-lui la valeur par défaut de getDate (). Cela s'occupera des relevés d'insertion. Deuxièmement, ajoutez un déclencheur sur la mise à jour que les mises à jour lâchées à GetDate (). Les mises à jour sont maintenant couvertes. Enfin, ajoutez un champ bit / booléen isdeletted avec la valeur par défaut de 0. Si un utilisateur doit supprimer une ligne, retournez le bit. Étant donné que lorsque vous "supprimez" une ligne, vous mettez en train de mettre à jour le champ ISDOTED (et utilisez donc une action de mise à jour), les suppressions sont désormais horodatées.

Pour obtenir l'activité la plus récente sur la table: Pour obtenir uniquement l'horodatage: xxx

pour obtenir plus d'informations: xxx


2 commentaires

Bien sûr, si vous ajoutez le champ Bit Isdeletted, tout votre code existant devra être refait à ce que les enregistrements supprimés ne soient pas utilisés dans les requêtes.


Certes, ça ne va pas être sans douleur, mais il montrera la dernière activité sur la table, peu importe ce que c'était.



1
votes

J'ajouterais un suivi de changement au mélange - par opposition à modifier la capture de données, ce n'est pas une fonctionnalité d'entreprise uniquement.

Lire à ce sujet à http://msdn.microsoft.com/fr -us / bibliothèque / cc280462.aspx

similaire à sys.dm_db_index_usage_stats , les données ne sont pas là pour toujours (même si elle survit à redémarrer et est configurable) et vous devrez extraire et persister l'information particulière que vous cherchez. pour.

MDD


0 commentaires

18
votes
SELECT t.name,
       user_seeks,
       user_scans,
       user_lookups,
       user_updates,
       last_user_seek,
       last_user_scan,
       last_user_lookup,
       last_user_update
FROM   sys.dm_db_index_usage_stats i
       JOIN sys.tables t
         ON ( t.object_id = i.object_id )
WHERE  database_id = DB_ID() 

0 commentaires

10
votes

Vous pouvez facilement obtenir les dernières dates insérées / mises à jour / supprimées comme suit: xxx


4 commentaires

Vous pouvez exécuter l'instruction Sélectionner interne si vous n'avez pas d'autorisation d'administrateur ni de permission élevée et obtenez toujours vos résultats. Grande solution.


Mayeb j'ai manqué quelque chose mais dans SQL-Server 2008, cela ne montre aucune modification du LastUpdatedated (code> si des lignes ont été insérées / mises à jour / supprimées. Seulement lorsque la structure de la table a été modifiée (des colonnes / index ajoutés, etc.). Est-ce ce que l'OP prévu?


@ZIGIZ: Peut-être que vous le confondez avec la colonne sys.objects.modify_date , qui indique que les tableaux indiquent la date de modification de la structure. Les valeurs de la colonne LastUpdatedated de ce code sont basées sur les résultats de la STATS_Date fonction .


Cela ne fait pas ce qui est demandé. Il montre la dernière fois que les statistiques ont été mises à jour. Il est tout à fait possible d'insérer / supprimer / mettre à jour des lignes sans déclencher une mise à jour des statistiques. À l'inverse, il pourrait y avoir un plan de maintenance qui met à jour les statistiques, même si rien n'a changé.