<cdc.fn_cdc_get_net_changes_capture_instance> (Transact-SQL)

Gilt für:yes SQL Server (alle unterstützten Versionen)

Gibt eine Zeilenänderung für jede Quellzeile zurück, die innerhalb des angegebenen LSN-Bereichs (Log Sequence Numbers) geändert wurde.

Warten, was ist ein LSN? Jeder Datensatz im SQL Server Transaktionsprotokoll wird durch eine Protokollsequenznummer (LSN) eindeutig identifiziert. LSNs werden so sortiert, dass die durch LSN2 beschriebene Änderung nach der änderung, die durch LSN2 beschrieben wurde, nach der änderung, die vom Protokolldatensatz LSNN beschrieben wurde.

Der LSN eines Protokolldatensatzes, bei dem ein signifikantes Ereignis aufgetreten ist, kann nützlich sein, um korrekte Wiederherstellungssequenzen zu erstellen. Da LSNs sortiert sind, können Sie sie für Gleichheit und Ungleichheit vergleichen (d. h. , <, >=, =, <=, >=). Solche Vergleiche sind beim Erstellen von Wiederherstellungssequenzen hilfreich.

Wenn eine Quellzeile während des LSN-Bereichs mehrere Änderungen aufweist, wird eine einzelne Zeile, die den endgültigen Inhalt der Zeile widerspiegelt, von der unten beschriebenen Enumerationsfunktion zurückgegeben. Wenn beispielsweise eine Transaktion eine Zeile in die Quelltabelle einfügt und eine nachfolgende Transaktion innerhalb des LSN-Bereichs eine oder mehrere Spalten in dieser Zeile aktualisiert, gibt die Funktion nur eine Zeile zurück, die die aktualisierten Spaltenwerte enthält.

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 Aufnahmeinstanz angegebene Wert ist, wenn die Quelltabelle für die Datenerfassung aktiviert wurde. Weitere Informationen finden Sie unter sys.sp_cdc_enable_table (Transact-SQL).

Topic link iconTransact-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, der den niedrigen Endpunkt des LSN-Bereichs darstellt, der in den Resultset aufgenommen werden soll. from_lsn ist binär(10).

Nur Zeilen im cdc.[ capture_instance]_CT Ändern der Tabelle mit einem Wert in __$start_lsn größer oder gleich from_lsn werden im Resultset enthalten.

to_lsn

Der LSN, der den hohen Endpunkt des LSN-Bereichs darstellt, der in den Resultset aufgenommen werden soll. to_lsn ist binär(10).

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

<>row_filter_option ::= { alle | alle mit Maske | alle mit zusammenführen }

Eine Option, die den Inhalt der Metadatenspalten sowie die im Resultset zurückgegebenen Zeilen steuert. Eine der folgenden Optionen ist möglich:

alle
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 ist in Zielumgebungen am attraktivsten, in denen ein Zusammenführungsvorgang direkt verfügbar ist, z. B. eine SQL Server 2019 (15.x) 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 beispielsweise ein Aktualisierungsvorgang in der Quelltabelle zwei Spalten in zwei Zeilen ändert, enthält die Änderungstabelle vier Zeilen, jeweils mit demselben __$start_lsnvalue.
__$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
__$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 gesetzt, die geänderten Spalten entsprechen.
<Erfasste Quelltabellenspalten> 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 in 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 Berechtigung zum Anzeigen der Quelldaten verfügt, gibt die Funktion eine Zeile mit NULL-Werten für alle Spalten zurück.

Hinweise

Änderungen am eindeutigen Bezeichner einer Zeile führen dazu fn_cdc_get_net_changes , dass stattdessen der anfängliche BEFEHL "UPDATE" mit einem DELETE-Befehl und stattdessen "EINFÜGEN" angezeigt wird. Dieses Verhalten ist erforderlich, um den Schlüssel sowohl vor als auch nach der Änderung nachzuverfolgen.

Fehler 313 wird erwartet, wenn der bereitgestellte LSN-Bereich beim Aufrufen oder cdc.fn_cdc_get_net_changes_<capture_instance>Aufrufen cdc.fn_cdc_get_all_changes_<capture_instance> nicht geeignet ist. Wenn der lsn_value Parameter über die Zeit der niedrigsten LSN oder höchsten LSN hinausgeht, wird die Ausführung dieser Funktionen in Fehler 313 zurückgegeben: Msg 313, Level 16, State 3, Line 1 An insufficient number of arguments were supplied for the procedure or function Der Entwickler sollte sich um diesen Fehler kümmern. Beispiel-T-SQL für eine Problemumgehung finden Sie unter ReplTalk auf GitHub.

Beispiele

Im folgenden Beispiel wird die Funktion cdc.fn_cdc_get_net_changes_HR_Department verwendet, um die netto vorgenommenen Änderungen an der Quelltabelle HumanResources.Department während eines bestimmten Zeitintervalls zu melden.

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 Funktion sys.fn_cdc_map_time_to_lsn wird dann verwendet, um das Zeitintervall einem änderungsdatenerfassungsabfragebereich zuzuordnen, der von LSN-Werten gebunden 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.

Hinweis

Bevor Sie dieses Beispiel ausführen, müssen Sie zuerst Beispiel B in sys.sp_cdc_enable_table (Transact-SQL) ausführen, um CDC in der Tabelle HumanResources.Departmentzu aktivieren. Im folgenden Beispiel ist HR_Department der Name der CDC-Aufnahmeinstanz, wie in sys.sp_cdc_enable_table.

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 = DATEADD(day, -1, GETDATE()) ;  
-- 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 @from_lsn = ISNULL(sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time), [sys].[fn_cdc_get_min_lsn]('HR_Department') );
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');  

Weitere Informationen