2016-09-15 2 views

Répondre

0

Vous pouvez suivre l'opération, les colonnes modifiées et les nouvelles valeurs à l'aide du suivi des modifications. Cependant, l'obtention de l'ancienne valeur hors du suivi des modifications n'est pas possible. SQL Server 2016 offre la nouvelle fonctionnalité "Modifier la capture de données", qui vous donne les informations nécessaires sur l'ancienne valeur avant la mise à jour/suppression (voir https://msdn.microsoft.com/en-us/library/bb933994.aspx).

Si vous n'avez pas accès à un SQL Server 2016, voici comment vous pouvez configurer le suivi des modifications:

  • Activer à la base de données

    ALTER DATABASE <YourDatabase> f.e. DeviceDatabase 
    SET CHANGE_TRACKING = ON 
    (CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON) 
    
  • Activer le suivi des modifications pour votre besoin tables

    ALTER TABLE <YourTable> f.e. Devices 
    ENABLE CHANGE_TRACKING 
    WITH (TRACK_COLUMNS_UPDATED = ON) 
    
  • Configuration d'un travail de base de données opie changement d'informations dans votre tableau personnalisé chaque minute, heure, jour (ce dont vous avez besoin)

    DECLARE @minversion bigint; 
    SET @minversion = (SELECT MinVersion = CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID('Devices'))) 
    
    SELECT SYS_CHANGE_COLUMNS, e.Id FROM 
    CHANGETABLE(CHANGES Devices, @minversion) AS C 
    LEFT OUTER JOIN Devices AS e 
    ON e.Id = c.Id; 
    
  • Pour obtenir la dernière valeur de la colonne Changed vous pouvez essayer (mais méfiez-vous de plusieurs mises à jour de la même ligne . vous obtenez seulement la dernière valeur).

    CHANGE_TRACKING_IS_COLUMN_IN_MASK 
    (COLUMNPROPERTY(OBJECT_ID('Devices'), 'Id', 'ColumnId') 
    ,c.sys_change_columns) 
    

Ceci renvoie 1 si la colonne a changé, 0 sinon. Vous pouvez ajouter ceci pour chaque colonne de votre table et rejoindre sur value = 1, puis ajouter la valeur à votre requête.

Enfin, Je recommande simplement d'utiliser des procédures stockées pour mettre à jour/insérer/supprimer sur vos tables. Dans ceux-ci, vous pouvez facilement insérer toutes les informations que vous souhaitez stocker à propos de la modification de votre tableau personnalisé. Si vous avez SQL Server 2016 tho, essayez ce que j'ai mentionné ci-dessus, finalement.

0

En fait, si vous remplacez la méthode SaveChanges() dans votre classe de contexte de données, vous pouvez accéder à ChangeTracker. Cela vous donne toutes les entités actuellement suivies par le contexte et leur EntityState (si elles sont ajoutées/modifiées/supprimées/inchangées, etc).

Ici vous pouvez obtenir la classe DbEntityEntry et à partir de là, obtenir les valeurs actuelles des entités et/ou leurs valeurs précédentes si l'entité est dans l'état modifié. J'utilise actuellement cette méthode pour effectuer un audit de base de qui fait cela à quelle entité.

+0

Je ne peux pas comment essayer ça! –

+0

Si vous utilisez l'Entité-Entité Code Premier, vous aurez une classe DbContext. Utilisez la méthode ci-dessus dans cette classe. Vous pouvez étendre la classe partielle DbContext si vous avez utilisé la base de données en premier (si vous avez un edmx), donc 'public partial class MyExtendedDbContext'. – Wurd