CHANGETABLE (Transact-SQL)

Gibt Änderungsnachverfolgungsinformationen für eine Tabelle zurück. Sie können diese Anweisung verwenden, um alle Änderungen für eine Tabelle oder die Änderungsnachverfolgungsinformationen für eine bestimmte Zeile abzurufen.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

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

Argumente

  • CHANGES table , last_sync_version
    Gibt Nachverfolgungsinformationen für alle Änderungen an einer Tabelle zurück, die seit der von last_sync_version angegebenen Version vorgenommen wurden.

    • table
      Die benutzerdefinierte Tabelle, von der nachverfolgte Änderungen abgerufen werden sollen. Die Änderungsnachverfolgung muss für die Tabelle aktiviert sein. Es kann ein Tabellenname verwendet werden, der aus ein, zwei, drei oder vier Teilen besteht. Der Tabellenname kann synonym mit der Tabelle sein.

    • last_sync_version
      Wenn Änderungen abgeufen werden, muss die aufrufende Anwendung den Punkt angeben, ab dem Änderungen erforderlich sind. Die last_sync_version gibt diesen Punkt an. Die Funktion gibt Informationen für alle Zeilen zurück, die ab dieser Version geändert worden sind. Die Anwendung fragt Änderungen mit einer größeren Versionsnummer als last_sync_version ab.

      Bevor sie Änderungen abruft, ruft die Anwendung in der Regel CHANGE_TRACKING_CURRENT_VERSION() auf, um die Version abzurufen, die das nächste Mal verwendet wird, wenn Änderungen erforderlich sind. Deshalb muss die Anwendung den tatsächlichen Wert nicht interpretieren oder verstehen.

      Da last_sync_version von der aufrufenden Anwendung abgerufen wird, muss die Anwendung den Wert beibehalten. Wenn die Anwendung diesen Wert verliert, müssen Daten erneut initialisiert werden.

      .

      last_sync_version ist bigint. Der Wert muss skalar sein. Ein Ausdruck verursacht einen Syntaxfehler.

      Wenn der Wert NULL ist, werden alle nachverfolgten Änderungen zurückgegeben.

      last_sync_version muss überprüft werden, um sicherzustellen, dass sie nicht zu alt ist, da sonst einige oder alle Änderungsinformationen möglicherweise entsprechend der für die Datenbank konfigurierten Beibehaltungsdauer bereinigt wurden. Weitere Informationen finden Sie unter CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL) und ALTER DATABASE SET-Optionen (Transact-SQL).

  • VERSION table, { <primary_key_values> }
    Gibt die letzten Änderungsnachverfolgungsinformationen für eine angegebene Zeile zurück. Primärschlüsselwerte müssen die Zeile identifizieren. <primary_key_values> identifiziert die Primärschlüsselspalten und gibt die Werte an. Die Namen der Primärschlüsselspalten können in beliebiger Reihenfolge angegeben werden.

    • Table
      Die benutzerdefinierte Tabelle, von der Änderungsnachverfolgungsinformationen abgerufen werden sollen. Die Änderungsnachverfolgung muss für die Tabelle aktiviert sein. Es kann ein Tabellenname verwendet werden, der aus ein, zwei, drei oder vier Teilen besteht. Der Tabellenname kann synonym mit der Tabelle sein.

    • column_name
      Gibt den Namen der Primärschlüsselspalte oder der Spalten an. Es können mehrere Spaltennamen in beliebiger Reihenfolge angegeben werden.

    • Value
      Der Wert des Primärschlüssels. Wenn mehrere Primärschlüsselspalten vorhanden sind, müssen die Werte in der gleichen Reihenfolge angegeben werden, in der sie in der column_name-Liste aufgeführt sind.

  • [AS] table_alias [ (column_alias [ ,...n ] ) ]
    Stellt Namen für die Ergebnisse bereit, die von CHANGETABLE zurückgegeben werden.

    • table_alias
      Der Aliasname der Tabelle, der von CHANGETABLE zurückgegeben wird. table_alias ist erforderlich und muss ein gültiger Bezeichner sein.

    • column_alias
      Ein optionaler Spaltenalias oder eine Liste von Spaltenaliasnamen für die Spalten, die von CHANGETABLE zurückgegeben werden. Hierdurch können Spaltennamen angepasst werden, falls die Ergebnisse doppelte Namen aufweisen.

Rückgabetypen

table

Rückgabewerte

CHANGETABLE CHANGES

Wenn CHANGES angegeben wird, werden 0 (null) oder mehr Zeilen, die die folgenden Spalten aufweisen, zurückgegeben.

Spaltenname

Datentyp

Beschreibung

SYS_CHANGE_VERSION

bigint

Versionswert, der der letzten Änderung an der Zeile zugeordnet ist.

SYS_CHANGE_CREATION_VERSION

bigint

Versionswerte, die dem letzten Einfügevorgang zugeordnet sind.

SYS_CHANGE_OPERATION

nchar(1)

Gibt den Typ der Änderung an:

U = Aktualisieren

I = Einfügen

D = Löschen

SYS_CHANGE_COLUMNS

varbinary(4100)

Listet die Spalten auf, die sich seit der Baselineversion geändert haben.

HinweisHinweis
Berechnete Spalten werden nie als geändert aufgelistet.

Der Wert ist NULL, wenn eine der folgenden Bedingungen zutrifft:

  • Die Änderungsnachverfolgung für Spalten ist nicht aktiviert.

  • Der Vorgang ist ein Einfüge- oder Löschvorgang.

  • Alle Nicht-Primärschlüsselspalten wurden in einem Vorgang aktualisiert. Dieser Binärwert sollte nicht direkt interpretiert werden. Verwenden Sie zum Interpretieren stattdessen CHANGE_TRACKING_IS_COLUMN_IN_MASK().

SYS_CHANGE_CONTEXT

varbinary(128)

Änderungskontextinformationen, die optional angegeben werden können, indem Sie die WITH-Klausel als Teil einer INSERT-, UPDATE- oder DELETE-Anweisung verwenden.

<<Wert der Primärschlüsselspalte>>

Identisch mit den Benutzertabellenspalten.

Die Primärschlüsselwerte für die nachverfolgte Tabelle. Diese Werte identifizieren jede Zeile in der Benutzertabelle eindeutig.

CHANGETABLE VERSION

Wenn VERSION angegeben wird, wird eine Zeile, die die folgenden Spalten aufweist, zurückgegeben.

Spaltenname

Datentyp

Beschreibung

SYS_CHANGE_VERSION

bigint

Wert der aktuellen Änderungsversion, der mit der Zeile verknüpft ist.

Der Wert ist NULL, wenn für einen längeren Zeitraum als der Beibehaltungsdauer für die Änderungsnachverfolgung keine Änderung vorgenommen wurde oder wenn die Zeile seit Aktivierung der Änderungsnachverfolgung nicht geändert wurde.

SYS_CHANGE_CONTEXT

varbinary(128)

Änderungskontextinformationen, die optional angegeben werden können, indem Sie die WITH-Klausel als Teil einer INSERT-, UPDATE- oder DELETE-Anweisung verwenden.

<<Wert der Primärschlüsselspalte>>

Identisch mit den Benutzertabellenspalten.

Die Primärschlüsselwerte für die nachverfolgte Tabelle. Diese Werte identifizieren jede Zeile in der Benutzertabelle eindeutig.

Hinweise

Die CHANGETABLE-Funktion wird in der Regel in der FROM-Klausel einer Abfrage verwendet, so als handele es sich um eine Tabelle.

CHANGETABLE(CHANGES...)

Um Zeilendaten für neue oder geänderte Zeilen zu erhalten, verbinden Sie das Resultset mit der Benutzertabelle, indem Sie die Primärschlüsselspalten verwenden. Es wird nur eine Zeile für jede Zeile in der Benutzertabelle, die sich geändert hat, zurückgegeben, auch dann, wenn seit dem last_sync_version-Wert mehrere Änderungen an derselben Zeile vorgenommen wurden.

Änderungen von Primärschlüsselspalten werden nie als Aktualisierungen markiert. Wenn sich ein Primärschlüsselwert ändert, wird dies als Löschung des alten Werts und Einfügung des neuen Werts betrachtet.

Wenn Sie eine Zeile löschen und dann eine Zeile mit dem alten Primärschlüssel einfügen, wir die Änderung als Aktualisierung aller Spalten in der Zeile betrachtet.

Die für die SYS_CHANGE_OPERATION-Spalte und SYS_CHANGE_COLUMNS-Spalte zurückgegebenen Werte sind relativ zur angegebenen Baselineversion. Wenn zum Beispiel bei Version 10 ein Einfügevorgang und bei Version 15 ein Aktualisierungsvorgang vorgenommen wurde und die Baseline last_sync_version 12 ist, wird eine Aktualisierung gemeldet. Wenn der last_sync_version-Wert 8 beträgt, wird eine Einfügung gemeldet. SYS_CHANGE_COLUMNS meldet berechnete Spalten nie als aktualisiert.

Im Allgemeinen werden alle Vorgänge, bei denen Daten in Benutzertabellen eingefügt, aktualisiert oder gelöscht werden, nachverfolgt, einschließlich der MERGE-Anweisung.

Die folgenden Vorgänge, die sich auf Benutzertabellendaten auswirken, werden nicht nachverfolgt:

  • Ausführen der UPDATETEXT-Anweisung

    Diese Anweisung ist veraltet und wird in einer zukünftigen Version von SQL Server entfernt. Es werden jedoch Änderungen nachverfolgt, die durch die Verwendung der .WRITE-Klausel der UPDATE-Anweisung vorgenommen werden.

  • Löschen von Zeilen mit TRUNCATE TABLE

    Wenn eine Tabelle abgeschnitten ist, werden die mit der Tabelle verknüpften Versionsinformationen der Änderungsnachverfolgung zurückgesetzt, als ob die Änderungsnachverfolgung gerade erst für die Tabelle aktiviert wurde. Eine Clientanwendung sollte immer die zuletzt synchronisierte Version überprüfen. Die Überprüfung schlägt fehl, wenn die Tabelle abgeschnitten wurde.

CHANGETABLE(VERSION...)

Ein leeres Resultset wird zurückgegeben, wenn ein nicht vorhandener Primärschlüssel angegeben wird.

Der Wert von SYS_CHANGE_VERSION kann NULL sein, wenn für einen längeren Zeitraum als der Beibehaltungsdauer keine Änderung vorgenommen wurde (z. B. wenn die Änderungsinformationen durch ein Cleanup entfernt wurden) oder wenn die Zeile seit Aktivierung der Änderungsnachverfolgung für die Tabelle nicht geändert wurde.

Berechtigungen

Die folgenden Berechtigungen für die Tabelle, die durch den table-Wert angegeben ist, sind zum Abrufen von Änderungsnachverfolgungsinformationen erforderlich:

  • SELECT-Berechtigung für die Primärschlüsselspalten

  • VIEW CHANGE TRACKING

Beispiele

A. Zurückgeben von Zeilen für eine Erstsynchronisierung der Daten

Im folgenden Beispiel wird gezeigt, wie Daten für eine Erstsynchronisierung der Tabellendaten abgerufen werden. Die Abfrage gibt alle Zeilendaten und ihre zugehörigen Versionen zurück. Sie können diese Daten dann einfügen oder dem System hinzufügen, das die synchronisierten Daten enthalten soll.

-- 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. Auflisten aller Änderungen, die seit einer bestimmten Version vorgenommen wurden

Im folgenden Beispiel werden alle Änderungen aufgelistet, die seit der angegebenen Version (@last_sync_version)) in der Tabelle vorgenommen wurden. [Emp-ID] und SSN ist Spalten in einem zusammengesetzten Primärschlüssel.

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. Abrufen aller geänderten Daten für eine Synchronisierung

Im folgenden Beispiel wird gezeigt, wie Sie alle geänderten Daten abrufen können. Diese Abfrage führt die Änderungsnachverfolgungsinformationen mit der Benutzertabelle zusammen, sodass Benutzertabelleninformationen zurückgegeben werden. Ein LEFT OUTER JOIN wird verwendet, damit eine Zeile für gelöschte Zeilen zurückgegeben wird.

-- 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. Erkennen von Konflikten mit CHANGETABLE(VERSION...)

Im folgenden Beispiel wird gezeigt, wie eine Zeile nur dann aktualisiert wird, wenn sie sich seit der letzten Synchronisierung nicht geändert hat. Die Versionsnummer der betreffenden Zeile wird mit CHANGETABLE abgerufen. Wenn die Zeile aktualisiert wurde, werden keine Änderungen vorgenommen, und die Abfrage gibt Informationen über die aktuelle Änderung der Zeile zurück.

-- @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);