web-dev-qa-db-fra.com

Comment ajouter une colonne "dernière mise à jour" dans une table SQL Server 2008 R2?

J'ai une table dans ma base de données SQL Server 2008 R2 et je voudrais ajouter une colonne appelée LastUpdated, qui sera automatiquement modifiée à chaque mise à jour de la ligne. De cette façon, je peux voir quand chaque ligne individuelle a été mise à jour pour la dernière fois.

Il semble que SQL Server 2008 R2 ne dispose pas d'un type de données pour gérer cela comme les versions précédentes, donc je ne suis pas sûr de la meilleure façon de le faire. Je me suis interrogé sur l'utilisation d'un déclencheur, mais que se passerait-il lorsque le déclencheur mettrait à jour la ligne? Cela déclenchera-t-il à nouveau la détente, etc.?

43
Avrohom Yisroel

Pour savoir quelle ligne a été mise à jour pour la dernière fois, vous devez créer une nouvelle colonne de type DATETIME/DATETIME2 Et la mettre à jour avec un déclencheur. Aucun type de données ne se met à jour automatiquement avec les informations de date/heure à chaque mise à jour de la ligne.

Pour éviter la récursivité, vous pouvez utiliser la clause UPDATE() à l'intérieur du déclencheur, par ex.

ALTER TRIGGER dbo.SetLastUpdatedBusiness 
ON dbo.Businesses 
AFTER UPDATE -- not insert!
AS
BEGIN
    IF NOT UPDATE(LastUpdated)
    BEGIN
        UPDATE t
            SET t.LastUpdated = CURRENT_TIMESTAMP -- not dbo.LastUpdated!
            FROM dbo.Businesses AS t -- not b!
            INNER JOIN inserted AS i 
            ON t.ID = i.ID;
    END
END
GO
62
Aaron Bertrand

Ce n'est pas si simple, malheureusement.

Vous pouvez ajouter un nouveau champ DATETIME (ou DATETIME2) À votre table et vous pouvez lui donner une contrainte par défaut de GETDATE() - qui définira la valeur lorsqu'un nouveau la ligne est insérée.

Malheureusement, à part la création d'un déclencheur AFTER UPDATE, Il n'y a aucun moyen "prêt à l'emploi" de le maintenir à jour tout le temps. Le déclencheur en soi n'est pas difficile à écrire, mais vous devrez l'écrire pour chaque table qui devrait avoir cette fonctionnalité .....

10
marc_s