CHANGETABLE (Transact-SQL)CHANGETABLE (Transact-SQL)

CETTE RUBRIQUE S’APPLIQUE À :ouiSQL Server (à partir de la version 2008)ouiAzure SQL DatabasenonAzure SQL Data Warehouse nonParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

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.Returns change tracking information for a table.You can use this statement to return all changes for a table or change tracking information for a specific row.

Icône de lien de rubrique Conventions de la syntaxe Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SyntaxeSyntax


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 ] )  

ArgumentsArguments

MODIFICATIONS table , last_sync_versionCHANGES table , last_sync_version
Retourne le suivi des informations pour toutes les modifications apportées à une table qui se sont produites depuis la version spécifiée par last_sync_version.Returns tracking information for all changes to a table that have occurred since the version that is specified by last_sync_version.

tabletable
Table définie par l'utilisateur sur laquelle obtenir le suivi des modifications.Is the user-defined table on which to obtain tracked changes. Le suivi des modifications doit être activé sur la table.Change tracking must be enabled on the table. Un nom de table en une, deux, trois ou quatre parties peut être utilisé.A one-, two-, three-, or four-part table name can be used. Le nom de table peut être un synonyme de la table.The table name can be a synonym to the table.

last_sync_versionlast_sync_version
Lorsqu'elle obtient des modifications, l'application appelante doit spécifier le point à partir duquel les modifications sont requises.When it obtains changes, the calling application must specify the point from which changes are required. L'argument last_sync_version spécifie ce point.The last_sync_version specifies that point. La fonction retourne des informations pour toutes les lignes qui ont été modifiées depuis la version considérée.The function returns information for all rows that have been changed since that version. L'application exécute une requête pour recevoir les modifications avec une version supérieure à last_sync_version.The application is querying to receive changes with a version greater than last_sync_version.

En général, avant d’obtenir les modifications, l’application appelle CHANGE_TRACKING_CURRENT_VERSION() pour obtenir la version qui sera utilisée, les modifications de temps suivantes sont requises.Typically, before it obtains changes, the application will call CHANGE_TRACKING_CURRENT_VERSION() to obtain the version that will be used the next time changes are required. Par conséquent, l'application n'a pas besoin d'interpréter ou comprendre la valeur réelle.Therefore, the application does not have to interpret or understand the actual value.

Comme last_sync_version est obtenu par l'application appelante, celle-ci doit rendre la valeur persistante.Because last_sync_version is obtained by the calling application, the application has to persist the value. Si l'application perd cette valeur, elle doit alors réinitialiser les données.If the application loses this value then it will need to re-initialize data.

last_sync_version est bigint.last_sync_version is bigint. La valeur doit être scalaire.The value must be scalar. Une expression entraîne une erreur de syntaxe.An expression will cause a syntax error.

Si la valeur est NULL, toutes les modifications suivies sont retournées.If the value is NULL, all tracked changes are returned.

last_sync_version doivent être validées pour garantir qu’il n’est pas trop ancien, car certaines ou toutes les informations de modification peuvent avoir été nettoyées en fonction de la période de rétention configurée pour la base de données.last_sync_version should be validated to ensure that it is not too old, because some or all the change information might have been cleaned up according to the retention period configured for the database. Pour plus d’informations, consultez CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL) et Options ALTER DATABASE SET (Transact-SQL).For more information, see CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL) and ALTER DATABASE SET Options (Transact-SQL).

VERSION table, {< primary_key_values >}VERSION table, { <primary_key_values> }
Retourne les informations de suivi des modifications les plus récentes pour une ligne spécifiée.Returns the latest change tracking information for a specified row. Les valeurs de clé primaire doivent identifier la ligne.Primary key values must identify the row. <primary_key_values> identifie les colonnes de clé primaire et spécifie les valeurs.<primary_key_values> identifies the primary key columns and specifies the values. Les noms des colonnes clés primaires peuvent être spécifiés dans n'importe quel ordre.The primary key column names can be specified in any order.

TableTable
Table définie par l'utilisateur sur laquelle obtenir les informations de suivi des modifications.Is the user-defined table on which to obtain change tracking information. Le suivi des modifications doit être activé sur la table.Change tracking must be enabled on the table. Un nom de table en une, deux, trois ou quatre parties peut être utilisé.A one-, two-, three-, or four-part table name can be used. Le nom de table peut être un synonyme de la table.The table name can be a synonym to the table.

column_namecolumn_name
Spécifie le nom de la colonne ou des colonnes clés primaires.Specifies the name of primary key column or columns. Plusieurs noms de colonne peuvent être spécifiés dans un ordre quelconque.Multiple column names can be specified in any order.

ValueValue
Valeur de la clé primaire.Is the value of the primary key. 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 le column_name liste.If there are multiple primary key columns, the values must be specified in the same order as the columns appear in the column_name list.

[EN] alias_de_la_table [(column_alias [,... n ])][AS] table_alias [ (column_alias [ ,...n ] ) ]
Fournit des noms pour les résultats retournés par CHANGETABLE.Provides names for the results that are returned by CHANGETABLE.

table_aliastable_alias
Nom d'alias de la table retournée par CHANGETABLE.Is the alias name of the table that is returned by CHANGETABLE. alias_de_la_table est obligatoire et doit être valide identificateur.table_alias is required and must be a valid identifier.

column_aliascolumn_alias
Alias de colonne facultatif ou liste d'alias de colonne pour les colonnes retournées par CHANGETABLE.Is an optional column alias or list of column aliases for the columns that are returned by CHANGETABLE. Ce paramètre permet de personnaliser les noms de colonne au cas où il existerait des noms en double dans les résultats.This enables column names to be customized in case there are duplicate names in the results.

Types de retourReturn Types

tabletable

Valeurs de retourReturn Values

CHANGETABLE CHANGESCHANGETABLE CHANGES

Lorsque CHANGES est spécifié, zéro, une ou plusieurs lignes contenant les colonnes suivantes sont retournées.When CHANGES is specified, zero or more rows that have the following columns are returned.

Nom de colonneColumn name Type de donnéesData type DescriptionDescription
SYS_CHANGE_VERSIONSYS_CHANGE_VERSION bigintbigint Valeur de version associée à la dernière modification apportée à la ligneVersion value that is associated with the last change to the row
SYS_CHANGE_CREATION_VERSIONSYS_CHANGE_CREATION_VERSION bigintbigint Valeurs de version associées à la dernière opération d'insertion.Version values that are associated with the last insert operation.
SYS_CHANGE_OPERATIONSYS_CHANGE_OPERATION nchar(1)nchar(1) Spécifie le type de modification :Specifies the type of change:

U = mise à jourU = Update

Je = insertionI = Insert

D = suppressionD = Delete
SYS_CHANGE_COLUMNSSYS_CHANGE_COLUMNS varbinary(4100)varbinary(4100) Répertorie les colonnes qui ont été modifiées depuis la version last_sync_version (de référence).Lists the columns that have changed since the last_sync_version (the baseline). Notez que les colonnes calculées ne sont jamais répertoriées comme modifiée.Note that computed columns are never listed as changed.

La valeur est NULL si l'une des conditions suivantes est remplie :The value is NULL when any one of the following conditions is true:

le suivi des modifications de colonne n'est pas activé ;Column change tracking is not enabled.

il s'agit d'une opération d'insertion ou de suppression ;The operation is an insert or delete operation.

toutes les colonnes dépourvues de clés primaires ont été mises à jour en une seule opération.All nonprimary key columns were updated in one operation. Cette valeur binaire ne doit pas être interprétée directement.This binary value should not be interpreted directly. Pour l’interpréter, utilisez plutôt CHANGE_TRACKING_IS_COLUMN_IN_MASK().Instead, to interpret it, use CHANGE_TRACKING_IS_COLUMN_IN_MASK().
SYS_CHANGE_CONTEXTSYS_CHANGE_CONTEXT varbinary(128)varbinary(128) Modifier les informations de contexte que vous pouvez éventuellement spécifier à l’aide de la WITH clause dans le cadre d’une instruction INSERT, UPDATE ou DELETE.Change context information that you can optionally specify by using the WITH clause as part of an INSERT, UPDATE, or DELETE statement.
<valeur de colonne de clé primaire ><primary key column value> Identique aux colonnes de table utilisateurSame as the user table columns Valeurs de clés primaires pour la table faisant l'objet d'un suivi.The primary key values for the tracked table. Ces valeurs identifient de manière unique chaque ligne dans la table utilisateur.These values uniquely identify each row in the user table.

CHANGETABLE VERSIONCHANGETABLE VERSION

Lorsque VERSION est spécifié, une ligne contenant les colonnes suivantes est retournée.When VERSION is specified, one row that has the following columns is returned.

Nom de colonneColumn name Type de donnéesData type DescriptionDescription
SYS_CHANGE_VERSIONSYS_CHANGE_VERSION bigintbigint Valeur de la version actuelle des modifications associée à la ligne.Current change version value that is associated with the row.

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.The value is NULL if a change has not been made for a period longer than the change tracking retention period, or the row has not been changed since change tracking was enabled.
SYS_CHANGE_CONTEXTSYS_CHANGE_CONTEXT varbinary(128)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.Change context information that you can optionally specify by using the WITH clause as part of an INSERT, UPDATE, or DELETE statement.
<valeur de colonne de clé primaire ><primary key column value> Identique aux colonnes de table utilisateurSame as the user table columns Valeurs de clés primaires pour la table faisant l'objet d'un suivi.The primary key values for the tracked table. Ces valeurs identifient de manière unique chaque ligne dans la table utilisateur.These values uniquely identify each row in the user table.

NotesRemarks

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.The CHANGETABLE function is typically used in the FROM clause of a query as if it were a table.

CHANGETABLE(CHANGES...)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.To obtain row data for new or modified rows, join the result set to the user table by using the primary key columns. Qu’une seule ligne est retournée pour chaque ligne dans la table de l’utilisateur qui a été modifiée, même s’il y a eu plusieurs modifications apportées à la même ligne depuis le last_sync_version valeur.Only one row is returned for each row in the user table that has been changed, even if there have been multiple changes to the same row since the last_sync_version value.

Les modifications de colonne clé primaire ne sont jamais marquées comme des mises à jour.Primary key column changes are never marked as updates. 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.If a primary key value changes, it is considered to be a delete of the old value and an insert of the new value.

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.If you delete a row and then insert a row that has the old primary key, the change is seen as an update to all columns in the row.

Les valeurs retournées pour les colonnes SYS_CHANGE_OPERATION et SYS_CHANGE_COLUMNS sont par rapport à la ligne de base (last_sync_version) est spécifié.The values that are returned for the SYS_CHANGE_OPERATION and SYS_CHANGE_COLUMNS columns are relative to the baseline (last_sync_version) that is specified. 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 du 15 et si la ligne de base last_sync_version est égale à 12, une mise à jour sera signalée.For example, if an insert operation was made at version 10 and an update operation at version 15, and if the baseline last_sync_version is 12, an update will be reported. Si le last_sync_version valeur est 8, une insertion sera signalée.If the last_sync_version value is 8, an insert will be reported. SYS_CHANGE_COLUMNS ne signalera jamais les colonnes calculées comme ayant été mises à jour.SYS_CHANGE_COLUMNS will never report computed columns as having been updated.

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.Generally, all operations that insert, update, or delete of data in user tables are tracked, including the MERGE statement.

Les opérations suivantes qui impliquent les données des tables utilisateur ne font pas l'objet d'un suivi :The following operations that affect user table data are not tracked:

  • Exécution de l'instruction UPDATETEXTExecuting the UPDATETEXT statement

    Cette instruction est déconseillée et sera supprimée dans une prochaine version de SQL ServerSQL Server.This statement is deprecated and will be removed in a future version of SQL ServerSQL Server. Toutefois, les modifications apportées en utilisant la clause .WRITE de l'instruction UPDATE font l'objet d'un suivi.However, changes that are made by using the .WRITE clause of the UPDATE statement are tracked.

  • Suppression de lignes à l'aide de TRUNCATE TABLEDeleting rows by using 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.When a table is truncated, the change tracking version information that is associated with the table is reset as if change tracking has just been enabled on the table. Une application cliente doit toujours valider sa dernière version synchronisée.A client application should always validate its last synchronized version. La validation échoue si la table a été tronquée.The validation fails if the table has been truncated.

CHANGETABLE(VERSION...)CHANGETABLE(VERSION...)

Un jeu de résultats vide est retourné si une clé primaire inexistante est spécifiée.An empty result set is returned if a nonexistent primary key is specified.

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.The value of SYS_CHANGE_VERSION might be NULL if a change has not been made for longer than the retention period (for example, the cleanup has removed the change information) or the row has never been changed since change tracking was enabled for the table.

AutorisationsPermissions

Requiert les autorisations suivantes sur la table qui est spécifiée par le table valeur pour obtenir des informations de suivi des modifications :Requires the following permissions on the table that is specified by the table value to obtain change tracking information:

  • Autorisation SELECT sur les colonnes clés primairesSELECT permission on the primary key columns

  • VIEW CHANGE TRACKINGVIEW CHANGE TRACKING

ExemplesExamples

A.A. Retour de lignes pour une synchronisation initiale des donnéesReturning rows for an initial synchronization of data

L'exemple suivant montre comment obtenir des données pour une synchronisation initiale des données de table.The following example shows how to obtain data for an initial synchronization of the table data. La requête retourne toutes les données de ligne et leurs versions associées.The query returns all row data and their associated versions. Vous pouvez ensuite insérer ou ajouter ces données au système qui contiendra les données synchronisées.You can then insert or add this data to the system that will contain the synchronized data.

-- 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.B. Liste de toutes les modifications apportées depuis une version spécifiqueListing all changes that were made since a specific version

L'exemple suivant répertorie toutes les modifications apportées à une table depuis la version spécifiée (@last_sync_version).The following example lists all changes that were made in a table since the specified version (@last_sync_version). [Emp ID] et SSN sont des colonnes dans une clé primaire composite.[Emp ID] and SSN are columns in a composite primary key.

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.C. Obtention de toutes les données modifiées pour une synchronisationObtaining all changed data for a synchronization

L'exemple suivant montre comment obtenir toutes les données modifiées.The following example shows how you can obtain all data that has changed. Cette requête joint les informations de suivi des modifications à la table utilisateur afin que les informations de la table utilisateur soient retournées.This query joins the change tracking information with the user table so that user table information is returned. Un LEFT OUTER JOIN est utilisé afin qu'une ligne soit retournée pour les lignes supprimées.A LEFT OUTER JOIN is used so that a row is returned for deleted rows.

-- 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. Détection des conflits à l'aide de CHANGETABLE(VERSION...)Detecting conflicts by using CHANGETABLE(VERSION...)

L'exemple suivant montre comment mettre à jour une ligne uniquement si celle-ci n'a pas changé depuis la dernière synchronisation.The following example shows how to update a row only if the row has not changed since the last synchronization. Le numéro de version de la ligne spécifique est obtenu à l'aide de CHANGETABLE.The version number of the specific row is obtained by using 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.If the row has been updated, changes are not made and the query returns information about the most recent change to the row.

-- @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 aussiSee Also

Fonctions de suivi des modifications (Transact-SQL) Change Tracking Functions (Transact-SQL)
Suivi des modifications de données (SQL Server) Track Data Changes (SQL Server)
CHANGE_TRACKING_IS_COLUMN_IN_MASK (Transact-SQL) CHANGE_TRACKING_IS_COLUMN_IN_MASK (Transact-SQL)
CHANGE_TRACKING_CURRENT_VERSION (Transact-SQL) CHANGE_TRACKING_CURRENT_VERSION (Transact-SQL)
CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL)CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL)