Freigeben über


cdc.fn_cdc_get_net_changes_<capture_instance> (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_capture_instance, wobei capture_instance der für die Aufzeichnungsinstanz angegebene Wert zum Zeitpunkt der Aktivierung der Quelltabelle für Change Data Capture ist. 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 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 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 hat immer den Wert 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 hat immer den Wert 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 2012-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.

__$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

__$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>

variiert

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 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 AdventureWorks2012;
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');

Siehe auch

Verweis

cdc.fn_cdc_get_all_changes_<capture_instance> (Transact-SQL)

sys.fn_cdc_map_time_to_lsn (Transact-SQL)

sys.sp_cdc_enable_table (Transact-SQL)

sys.sp_cdc_help_change_data_capture (Transact-SQL)

Konzepte

Über Change Data Capture (SQL Server)