cdc.fn_cdc_get_net_changes_<Aufzeichnungsinstanz> (Transact-SQL)

Gibt eine Nettoänderungszeile für jede Quellzeile zurück, die sich innerhalb des angegebenen LSN-Bereichs geändert hat. Wenn eine Quellzeile mehrere Änderungen im LSN-Bereich aufweist, gibt diese Funktion lediglich eine Zeile mit dem endgültigen Zeileninhalt zurück. Fügt beispielsweise eine Transaktion eine Zeile in die Quelltabelle ein und aktualisiert daraufhin eine nachfolgende Transaktion innerhalb des LSN-Bereichs eine oder mehrere Spalten in dieser Zeile, gibt die Funktion nur eine Zeile mit den aktualisierten Spaltenwerten zurück.

Diese Enumerationsfunktion wird erstellt, wenn eine Quelltabelle für Change Data Capture aktiviert wird und die Nettonachverfolgung angegeben ist. Um die Nettonachverfolgung zu aktivieren, muss die Quelltabelle einen Primärschlüssel oder einen eindeutigen Index aufweisen. Der Funktionsname wird abgeleitet und verwendet das Format **cdc.fn_cdc_get_net_changes_**Aufzeichnungsinstanz, wobei Aufzeichnungsinstanz der für die Aufzeichnungsinstanz angegebene Wert zu dem Zeitpunkt ist, zu dem die Quelltabelle für Change Data Capture aktiviert wurde. Weitere Informationen finden Sie unter sys.sp_cdc_enable_table (Transact-SQL).

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

cdc.fn_cdc_get_net_changes_capture_instance ( from_lsn , to_lsn , '<row_filter_option>' )

<row_filter_option> ::=
{ all
 | all with mask
 | all with merge
}

Argumente

  • from_lsn
    Der LSN-Wert, der den unteren Endpunkt des LSN-Bereichs darstellt, der im Resultset enthalten sein soll. from_lsn ist vom Datentyp binary(10).

    Es sind nur Zeilen in der Änderungstabelle cdc.[capture_instance]_CT mit einem Wert in __$start_lsn größer oder gleich from_lsn im Resultset enthalten.

  • to_lsn
    Der LSN-Wert, der den oberen Endpunkt des LSN-Bereichs darstellt, der im Resultset enthalten sein soll. to_lsn ist vom Datentyp binary(10).

    Es sind nur Zeilen in der Änderungstabelle cdc.[capture_instance]_CT mit einem Wert in __$start_lsn kleiner oder gleich from_lsn oder gleich to_lsn im Resultset enthalten.

  • <row_filter_option> ::= { all | all with mask | all with merge }
    Eine Option, die den Inhalt der Metadatenspalten sowie die im Resultset zurückgegebenen Zeilen bestimmt. Eine der folgenden Optionen ist möglich:

    • all
      Gibt die LSN der letzten Zeilenänderung sowie den Vorgang zurück, der erforderlich ist, um die Zeile in den Metadatenspalten __$start_lsn und __$operation anzuwenden. Die Spalte __$update_mask ist immer NULL.

    • all with mask
      Gibt die LSN der letzten Zeilenänderung sowie den Vorgang zurück, der erforderlich ist, um die Zeile in den Metadatenspalten __$start_lsn und __$operation anzuwenden. Wenn ein Updatevorgang (__$operation = 4) zurückgibt, werden außerdem die im Update geänderten aufgezeichneten Spalten mit dem Wert gekennzeichnet, der in __$update_mask zurückgegeben wird.

    • all with merge
      Gibt die LSN der letzten Zeilenänderung in den Metadatenspalten __$start_lsn zurück. Die Spalte __$operation ist auf einen von zwei Werten festgelegt: 1 für Löschen oder 5 als Hinweis dafür, dass der zur Änderungsanwendung benötigte Vorgang entweder ein Einfügevorgang oder ein Updatevorgang ist. Die Spalte __$update_mask ist immer NULL.

      Da die Bestimmung des präzisen Vorgangs für eine bestimmte Änderung die Logik der Abfragekomplexität erhöht, soll diese Option die Abfrageleistung in den Fällen verbessern, in denen zur Angabe des für die Änderungsanwendung notwendigen Vorgangs nur darauf hingewiesen werden muss, dass es sich entweder um einen Einfügevorgang oder um einen Updatevorgang handelt, und die explizite Unterscheidung der beiden Vorgänge nicht notwendig ist. Diese Option eignet sich besonders für Zielumgebungen, in denen Mergevorgänge direkt verfügbar sind, z. B. in einer SQL Server 2008-Umgebung.

Zurückgegebene Tabelle

Spaltenname

Datentyp

Beschreibung

__$start_lsn

binary(10)

LSN, die dem Commit für die Änderung zugeordnet wurde.

Alle Änderungen, für die ein Commit in derselben Transaktion ausgeführt wurde, verwenden dieselbe Commit-LSN. Wenn z. B. bei einem Updatevorgang in der Quelltabelle zwei Spalten in zwei Zeilen geändert werden, enthält die Änderungstabelle vier Zeilen, die jeweils denselben __$start_lsn-Wert aufweisen.

__$seqval

binary(10)

Sequenzwert, der verwendet wird, um die Zeilenänderungen innerhalb einer Transaktion zu sortieren.

__$operation

int

Identifiziert den Vorgang der Datenbearbeitungssprache (Data Manipulation Language, DML), der erforderlich ist, um die Zeile der Änderungsdaten auf die Zieldatenquelle anzuwenden.

Wenn der Wert des row_filter_option-Parameters 'all' oder 'all with mask' ist, kann der Wert in dieser Spalte einen der folgenden Werte annehmen:

1 = Löschen

2 = Einfügen

4 = Aktualisieren

Wenn der Wert des row_filter_option-Parameters 'all with merge' ist, kann der Wert in dieser Spalte einen der folgenden Werte annehmen:

1 = Löschen

5 = Einfügen oder Aktualisieren

Der Wert 5 gibt an, dass nicht bekannt ist, ob die Zeile bereits vorhanden ist und lediglich aktualisiert werden muss oder ob die Zeile derzeit nicht vorhanden ist und eingefügt werden muss.

__$update_mask

varbinary(128)

Eine Bitmaske mit einem Bit, das den einzelnen aufgezeichneten Spalten entspricht, die für die Aufzeichnungsinstanz identifiziert wurden. Für diesen Wert sind alle definierten Bits auf 1 festgelegt, wenn __$operation = 1 oder 2 ist. Wenn __$operation = 3 oder 4, werden nur die Bits auf 1 festgelegt, die geänderten Spalten entsprechen.

<<captured source table columns>>

Unterschiedlich

Bei den von der Funktion zurückgegebenen verbleibenden Spalten handelt es sich um die Spalten aus der Quelltabelle, die beim Erstellen der Aufzeichnungsinstanz als aufgezeichnete Spalten identifiziert wurden. Wenn in der Liste der aufgezeichneten Spalten keine Spalten angegeben wurden, werden alle Spalten in der Quelltabelle zurückgegeben.

Berechtigungen

Erfordert die Mitgliedschaft in der festen Serverrolle sysadmin oder der festen Datenbankrolle db_owner. Für alle anderen Benutzer ist die SELECT-Berechtigung für alle aufgezeichneten Spalten in der Quelltabelle und, wenn eine Gatingrolle für die Aufzeichnungsinstanz definiert wurde, eine Mitgliedschaft in dieser Datenbankrolle erforderlich. Wenn der Aufrufer nicht über die Berechtigungen zum Anzeigen der Quelldaten verfügt, gibt die Funktion den Fehler 208 (Ungültiger Objektname) zurück.

Hinweise

Wenn der angegebene LSN-Bereich nicht in den Zeitraum der Änderungsnachverfolgung der Aufzeichnungsinstanz fällt, gibt die Funktion Fehler 208 (Ungültiger Objektname) zurück.

Beispiele

Im folgenden Beispiel wird die Funktion cdc.fn_cdc_get_net_changes_HR_Department verwendet, um die Nettoänderungen, die an der Quelltabelle HumanResources.Department während eines bestimmten Zeitintervalls vorgenommen wurden, zu berichten.

Zuerst wird die GETDATE-Funktion verwendet, um den Anfang des Zeitintervalls zu markieren. Nachdem mehrere DML-Anweisungen auf die Quelltabelle angewendet wurden, wird die GETDATE-Funktion erneut aufgerufen, um das Ende des Zeitintervalls zu identifizieren. Die sys.fn_cdc_map_time_to_lsn-Funktion wird dann verwendet, um das Zeitintervall einem Abfragebereich für Change Data Capture zuzuordnen, der von LSN-Werten eingeschlossen ist. Schließlich wird die cdc.fn_cdc_get_net_changes_HR_Department-Funktion abgefragt, um die Nettoänderungen an der Quelltabelle für das Zeitintervall zu erhalten. Beachten Sie, dass die eingefügte und anschließend gelöschte Zeile nicht in dem von der Funktion zurückgegebenen Resultset aufgeführt wird. Der Grund dafür ist, dass eine in einem Abfragefenster zuerst hinzugefügte und dann gelöschte Zeile keine Nettoänderung in der Quelltabelle für das Intervall erzeugt. Bevor Sie dieses Beispiel ausführen, müssen Sie Beispiel B in sys.sp_cdc_enable_table (Transact-SQL) ausführen.

USE AdventureWorks;
GO
DECLARE @begin_time datetime, @end_time datetime, @from_lsn binary(10), @to_lsn binary(10);
-- Obtain the beginning of the time interval.
SET @begin_time = GETDATE() -1;
-- DML statements to produce changes in the HumanResources.Department table.
INSERT INTO HumanResources.Department (Name, GroupName)
VALUES (N'MyDept', N'MyNewGroup');

UPDATE HumanResources.Department
SET GroupName = N'Resource Control'
WHERE GroupName = N'Inventory Management';

DELETE FROM HumanResources.Department
WHERE Name = N'MyDept';

-- Obtain the end of the time interval.
SET @end_time = GETDATE();
-- Map the time interval to a change data capture query range.
SET @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);
SET @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);

-- Return the net changes occurring within the query window.
SELECT * FROM cdc.fn_cdc_get_net_changes_HR_Department(@from_lsn, @to_lsn, 'all');