CHANGETABLE (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

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.

Conventions de la syntaxe Transact-SQL

Syntaxe

CHANGETABLE (  
    { CHANGES <table_name> , <last_sync_version> 
    | VERSION <table_name> , <primary_key_values> } 
    , [ FORCESEEK ] 
    )  
[AS] <table_alias> [ ( <column_alias> [ ,...n ] )  
  
<primary_key_values> ::=  
( <column_name> [ , ...n ] ) , ( <value> [ , ...n ] )  

Arguments

MODIFICATIONS table_name , last_sync_version
Retourne des informations de suivi pour toutes les modifications apportées à une table depuis la version spécifiée par last_sync_version.

table_name
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
Valeur scalaire bigint nullable. Une expression provoque une erreur de syntaxe. Si la valeur est NULL, toutes les modifications suivies sont retournées. Lorsqu'elle obtient des modifications, l'application appelante doit spécifier le point à partir duquel les modifications sont requises. Le 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 interroge pour recevoir des modifications avec une version supérieure à last_sync_version. En règle générale, avant d’obtenir les modifications, l’application appelle CHANGE_TRACKING_CURRENT_VERSION() pour obtenir la version qui sera utilisée la prochaine fois que des modifications seront requises. Par conséquent, l'application n'a pas besoin d'interpréter ou comprendre la valeur réelle. Étant donné que last_sync_version est obtenue par l’application appelante, l’application doit conserver la valeur. Si l'application perd cette valeur, elle doit alors réinitialiser les données. last_sync_version doit être validé pour s’assurer qu’elle n’est pas trop ancienne, car certaines ou toutes les informations de modification ont peut-être été nettoyées en fonction de la période de rétention configurée pour la base de données. Pour plus d’informations, consultez options CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL) et ALTER DATABASE SET (Transact-SQL).

VERSION table_name, { 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 clés primaires peuvent être spécifiés dans n'importe quel ordre.

table_name
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 clés primaires. 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 le même ordre que les colonnes apparaissent dans la liste column_name .

[ FORCESEEK ]
S’applique à : SQL Server (à compter de SQL Server 2016 (13.x) SP2 CU16, SQL Server 2017 (14.x) CU24 et SQL Server 2019 (15.x) CU11), Azure SQL Database et Azure SQL Managed Instance

Paramètre facultatif qui force l’utilisation d’une opération de recherche pour accéder au table_name. Dans certains cas où très peu de lignes ont changé, une opération d’analyse peut toujours être utilisée pour accéder au table_name. Si une opération d’analyse présente un problème de performances, utilisez le FORCESEEK paramètre .

[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 obligatoire 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 last_sync_version (de référence). Notez que les colonnes calculées ne sont jamais répertoriées comme 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, utilisez plutôt 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 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 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.

Remarques

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 clés primaires. Une seule ligne est retournée pour chaque ligne de la table utilisateur qui a été modifiée, même si plusieurs modifications ont été apportées à la même ligne depuis la valeur last_sync_version .

Les modifications de colonne 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 SYS_CHANGE_OPERATION colonnes et SYS_CHANGE_COLUMNS sont relatives à la base de référence (last_sync_version) spécifiée. Par exemple, si une opération d’insertion a été effectuée au niveau de la version 10 et une opération de mise à jour à la version 15, et si la base de référence last_sync_version est 12, une mise à jour est signalée. Si la valeur last_sync_version est 8, une insertion est 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 déconseillée et sera supprimée dans une version ultérieure de SQL Server. Toutefois, les modifications apportées à l’aide de la .WRITE clause de l’instruction UPDATE sont suivies.

  • 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 une modification n’a pas été apportée depuis plus longtemps 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 que le suivi des modifications a été activé pour la table.

Autorisations

Nécessite l’autorisation SELECT sur les colonnes de clé primaire et VIEW CHANGE TRACKING l’autorisation sur la table spécifiée par la <valeur table_name> pour obtenir des informations de suivi des modifications.

Exemples

R. 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);  

Voir aussi

Fonctions de suivi des modifications (Transact-SQL)
Suivre les modifications de données (SQL Server)
CHANGE_TRACKING_IS_COLUMN_IN_MASK (Transact-SQL)
CHANGE_TRACKING_CURRENT_VERSION (Transact-SQL)
CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL)