CHANGETABLE (Transact-SQL)

Retourne des informations de suivi des modifications pour une table. Vous pouvez utiliser cette instruction pour retourner toutes les modifications pour une table ou les informations de suivi des modifications pour une ligne spécifique.

Icône Lien de rubriqueConventions de syntaxe Transact-SQL

Syntaxe

CHANGETABLE (
        { CHANGES table , last_sync_version
        | VERSION table , <primary_key_values> } )
[AS] table_alias [ ( column_alias [ ,...n ] )

<primary_key_values> ::=
( column_name [ , ...n ] ) , ( value [ , ...n ] )

Arguments

  • CHANGES table , last_sync_version
    Retourne les informations de suivi de toutes les modifications apportées à une table depuis la version spécifiée par last_sync_version.

    • table
      Table définie par l'utilisateur sur laquelle obtenir le suivi des modifications. Le suivi des modifications doit être activé sur la table. Un nom de table en une, deux, trois ou quatre parties peut être utilisé. Le nom de table peut être un synonyme de la table.

    • last_sync_version
      Lorsqu'elle obtient des modifications, l'application appelante doit spécifier le point à partir duquel les modifications sont requises. L'argument last_sync_version spécifie ce point. La fonction retourne des informations pour toutes les lignes qui ont été modifiées depuis la version considérée. L'application exécute une requête pour recevoir les modifications avec une version supérieure à last_sync_version.

      Généralement, avant d'obtenir les modifications, l'application appelle CHANGE_TRACKING_CURRENT_VERSION() pour obtenir la version qui sera utilisée la prochaine fois que les modifications seront nécessaires. Par conséquent, l'application n'a pas besoin d'interpréter ou comprendre la valeur réelle.

      Comme last_sync_version est obtenu par l'application appelante, celle-ci doit rendre la valeur persistante. Si l'application perd cette valeur, elle doit alors réinitialiser les données.

      .

      L'argument last_sync_version est de type bigint. La valeur doit être scalaire. Une expression entraîne une erreur de syntaxe.

      Si la valeur est NULL, toutes les modifications suivies sont retournées.

      L'argument last_sync_version doit être validé pour garantir qu'il n'est pas trop ancien, car une partie ou l'ensemble des informations de modification peut avoir été nettoyé selon la période de rétention configurée pour la base de données. Pour plus d'informations, consultez CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL) et Options SET de ALTER DATABASE (Transact-SQL).

  • VERSION table, { <primary_key_values> }
    Retourne les informations de suivi des modifications les plus récentes pour une ligne spécifiée. Les valeurs de clé primaire doivent identifier la ligne. <primary_key_values> identifie les colonnes de clé primaire et spécifie les valeurs. Les noms des colonnes de clé primaire peuvent être spécifiés dans n'importe quel ordre.

    • Table
      Table définie par l'utilisateur sur laquelle obtenir les informations de suivi des modifications. Le suivi des modifications doit être activé sur la table. Un nom de table en une, deux, trois ou quatre parties peut être utilisé. Le nom de table peut être un synonyme de la table.

    • column_name
      Spécifie le nom de la colonne ou des colonnes de clé primaire. Plusieurs noms de colonne peuvent être spécifiés dans un ordre quelconque.

    • Value
      Valeur de la clé primaire. S'il existe plusieurs colonnes de clé primaire, les valeurs doivent être spécifiées dans l'ordre dans lequel les colonnes apparaissent dans la liste column_name.

  • [AS] table_alias [ (column_alias [ ,...n ] ) ]
    Fournit des noms pour les résultats retournés par CHANGETABLE.

    • table_alias
      Nom d'alias de la table retournée par CHANGETABLE. table_alias est requis et doit être un identificateur valide.

    • column_alias
      Alias de colonne facultatif ou liste d'alias de colonne pour les colonnes retournées par CHANGETABLE. Ce paramètre permet de personnaliser les noms de colonne au cas où il existerait des noms en double dans les résultats.

Types de retour

table

Valeurs de retour

CHANGETABLE CHANGES

Lorsque CHANGES est spécifié, zéro, une ou plusieurs lignes contenant les colonnes suivantes sont retournées.

Nom de la colonne

Type de données

Description

SYS_CHANGE_VERSION

bigint

Valeur de version associée à la dernière modification apportée à la ligne

SYS_CHANGE_CREATION_VERSION

bigint

Valeurs de version associées à la dernière opération d'insertion.

SYS_CHANGE_OPERATION

nchar(1)

Spécifie le type de modification :

U = Mettre à jour

I = Insérer

D = Supprimer

SYS_CHANGE_COLUMNS

varbinary(4100)

Répertorie les colonnes qui ont été modifiées depuis la version de référence.

RemarqueRemarque
Les colonnes calculées ne sont jamais répertoriées comme ayant été modifiées.

La valeur est NULL si l'une des conditions suivantes est remplie :

  • le suivi des modifications de colonne n'est pas activé ;

  • il s'agit d'une opération d'insertion ou de suppression ;

  • toutes les colonnes dépourvues de clés primaires ont été mises à jour en une seule opération. Cette valeur binaire ne doit pas être interprétée directement. Pour l'interpréter, il convient plutôt d'utiliser CHANGE_TRACKING_IS_COLUMN_IN_MASK ().

SYS_CHANGE_CONTEXT

varbinary(128)

Modifiez les informations de contexte que vous pouvez éventuellement spécifier à l'aide de la clause WITH dans le cadre d'une instruction INSERT, UPDATE ou DELETE.

<valeur de colonne de clé primaire>

Identique aux colonnes de table utilisateur

Valeurs de clés primaires pour la table faisant l'objet d'un suivi. Ces valeurs identifient de manière unique chaque ligne dans la table utilisateur.

CHANGETABLE VERSION

Lorsque VERSION est spécifié, une ligne contenant les colonnes suivantes est retournée.

Nom de la colonne

Type de données

Description

SYS_CHANGE_VERSION

bigint

Valeur de la version actuelle des modifications associée à la ligne.

La valeur est NULL si aucune modification n'a pas été apportée pendant un délai dépassant la période de rétention de suivi des modifications, ou si la ligne n'a pas été modifiée depuis l'activation du suivi des modifications.

SYS_CHANGE_CONTEXT

varbinary(128)

Modifiez les informations de contexte que vous pouvez éventuellement spécifier à l'aide de la clause WITH dans le cadre d'une instruction INSERT, UPDATE ou DELETE.

<valeur de colonne de clé primaire>

Identique aux colonnes de table utilisateur

Valeurs de clés primaires pour la table faisant l'objet d'un suivi. Ces valeurs identifient de manière unique chaque ligne dans la table utilisateur.

Notes

La fonction CHANGETABLE est utilisée en général dans la clause FROM d'une requête comme s'il s'agissait d'une table.

CHANGETABLE(CHANGES...)

Pour obtenir des données de ligne pour des lignes nouvelles ou modifiées, joignez le jeu de résultats à la table utilisateur en utilisant les colonnes de clé primaire. Seule une ligne est retournée pour chaque ligne modifiée dans la table utilisateur, même si plusieurs modifications ont été apportées à la même ligne depuis la valeur last_sync_version.

Les modifications de colonne de clé primaire ne sont jamais marquées comme des mises à jour. La modification d'une valeur de clé primaire est considérée comme une suppression de la valeur ancienne et une insertion de la valeur nouvelle.

Si vous supprimez une ligne puis insérez une ligne dotée de l'ancienne clé primaire, la modification est considérée comme une mise à jour de toutes les colonnes de la ligne.

Les valeurs retournées pour les colonnes SYS_CHANGE_OPERATION et SYS_CHANGE_COLUMNS sont relatives à la version de référence spécifiée. Par exemple, si une opération d'insertion a été effectuée à la version 10 et une opération de mise à jour à la version 15, et si la last_sync_version de référence est 12, une mise à jour sera signalée. Si la valeur last_sync_version est 8, une insertion sera signalée. SYS_CHANGE_COLUMNS ne signalera jamais les colonnes calculées comme ayant été mises à jour.

En général, toutes les opérations d'insertion, de mise à jour ou de suppression de données dans les tables utilisateur font l'objet d'un suivi, y compris l'instruction MERGE.

Les opérations suivantes qui impliquent les données des tables utilisateur ne font pas l'objet d'un suivi :

  • Exécution de l'instruction UPDATETEXT

    Cette instruction est abandonnée et sera supprimée dans une prochaine version de SQL Server. Toutefois, les modifications apportées en utilisant la clause .WRITE de l'instruction UPDATE font l'objet d'un suivi.

  • Suppression de lignes à l'aide de TRUNCATE TABLE

    Lorsqu'une table est tronquée, les informations sur la version du suivi des modifications associées à la table sont réinitialisées comme si le suivi des modifications venait d'être activé sur la table. Une application cliente doit toujours valider sa dernière version synchronisée. La validation échoue si la table a été tronquée.

CHANGETABLE(VERSION...)

Un jeu de résultats vide est retourné si une clé primaire inexistante est spécifiée.

La valeur de SYS_CHANGE_VERSION peut être NULL si aucune modification n'a pas été apportée pendant une période plus longue que la période de rétention (par exemple, le nettoyage a supprimé les informations de modification) ou si la ligne n'a jamais été modifiée depuis l'activation du suivi des modifications pour la table.

Autorisations

Requiert les autorisations suivantes sur la table spécifiée par la valeur table pour obtenir les informations de suivi des modifications :

  • Autorisation SELECT sur les colonnes de clé primaire

  • VIEW CHANGE TRACKING

Exemples

A. Retour de lignes pour une synchronisation initiale des données

L'exemple suivant montre comment obtenir des données pour une synchronisation initiale des données de table. La requête retourne toutes les données de ligne et leurs versions associées. Vous pouvez ensuite insérer ou ajouter ces données au système qui contiendra les données synchronisées.

-- Get all current rows with associated version
SELECT e.[Emp ID], e.SSN, e.FirstName, e.LastName,
    c.SYS_CHANGE_VERSION, c.SYS_CHANGE_CONTEXT
FROM Employees AS e
CROSS APPLY CHANGETABLE 
    (VERSION Employees, ([Emp ID], SSN), (e.[Emp ID], e.SSN)) AS c;

B. Liste de toutes les modifications apportées depuis une version spécifique

L'exemple suivant répertorie toutes les modifications apportées à une table depuis la version spécifiée (@last_sync_version). [Emp ID] et SSN sont des colonnes dans une clé primaire composite.

DECLARE @last_sync_version bigint;
SET @last_sync_version = <value obtained from query>;
SELECT [Emp ID], SSN,
    SYS_CHANGE_VERSION, SYS_CHANGE_OPERATION,
    SYS_CHANGE_COLUMNS, SYS_CHANGE_CONTEXT 
FROM CHANGETABLE (CHANGES Employees, @last_sync_version) AS C;

C. Obtention de toutes les données modifiées pour une synchronisation

L'exemple suivant montre comment obtenir toutes les données modifiées. Cette requête joint les informations de suivi des modifications à la table utilisateur afin que les informations de la table utilisateur soient retournées. Un LEFT OUTER JOIN est utilisé afin qu'une ligne soit retournée pour les lignes supprimées.

-- Get all changes (inserts, updates, deletes)
DECLARE @last_sync_version bigint;
SET @last_sync_version = <value obtained from query>;
SELECT e.FirstName, e.LastName, c.[Emp ID], c.SSN,
    c.SYS_CHANGE_VERSION, c.SYS_CHANGE_OPERATION,
    c.SYS_CHANGE_COLUMNS, c.SYS_CHANGE_CONTEXT 
FROM CHANGETABLE (CHANGES Employees, @last_sync_version) AS c
    LEFT OUTER JOIN Employees AS e
        ON e.[Emp ID] = c.[Emp ID] AND e.SSN = c.SSN;

D. Détection des conflits à l'aide de CHANGETABLE (VERSION...)

L'exemple suivant montre comment mettre à jour une ligne uniquement si celle-ci n'a pas changé depuis la dernière synchronisation. Le numéro de version de la ligne spécifique est obtenu à l'aide de CHANGETABLE. Si la ligne a été mise à jour, aucune modification n'est appliquée et la requête retourne des informations sur la modification la plus récente apportée à la ligne.

-- @last_sync_version must be set to a valid value
UPDATE
    SalesLT.Product
SET
    ListPrice = @new_listprice
FROM
    SalesLT.Product AS P
WHERE
    ProductID = @product_id AND
    @last_sync_version >= ISNULL (
        (SELECT CT.SYS_CHANGE_VERSION FROM 
            CHANGETABLE(VERSION SalesLT.Product,
            (ProductID), (P.ProductID)) AS CT),
        0);