Teilen über


<cdc.fn_cdc_get_net_changes_capture_instance> (Transact-SQL)

Gilt für: SQL Server

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

Was ist ein LSN? Jeder Datensatz im SQL Server-Transaktionsprotokoll wird durch eine Protokollsequenznummer (Log Sequence Number, LSN) eindeutig identifiziert. LSNs werden so sortiert, dass bei einer höheren LSN2-Änderung als LSN1 die durch LSN2 bezeichnete Änderung nach der änderung durch den 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 mit 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 Änderungsdatenerfassung aktiviert wurde. Weitere Informationen finden Sie unter sys.sp_cdc_enable_table (Transact-SQL).

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, der den niedrigen Endpunkt des LSN-Bereichs darstellt, der in das Resultset aufgenommen werden soll. from_lsn ist binary(10).

Nur Zeilen im cdc.[ capture_instance]_CT 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 das Resultset aufgenommen werden soll. to_lsn ist binary(10).

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

<> row_filter_option ::= { alle | alle mit Maske | alle mit Zusammenführung }

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

all
Gibt den LSN der letzten Änderung an der Zeile und den Vorgang zurück, der zum Anwenden der Zeile in den Metadatenspalten __$start_lsn und __$operation erforderlich ist. Die Spalte __$update_mask ist immer NULL.

all with mask
Gibt den LSN der letzten Änderung an der Zeile und den Vorgang zurück, der zum Anwenden der Zeile in den Metadatenspalten __$start_lsn und __$operation erforderlich ist. Wenn ein Aktualisierungsvorgang (__$operation = 4) zurückgibt, werden die erfassten Spalten, die in der Aktualisierung geändert wurden, in den in __$update_mask zurückgegebenen Wert markiert.

all with merge
Gibt die LSN der letzten Zeilenänderung in den Metadatenspalten __$start_lsn zurück. Die Spalte __$operation ist einer von zwei Werten: 1 für Löschvorgang und 5, um anzugeben, dass der für die Anwendung der Änderung erforderliche Vorgang entweder ein Einfügen oder eine Aktualisierung 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.

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, die 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 ist, werden nur die Bits, die spalten entsprechen, die geändert wurden, auf 1 festgelegt.
<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 fn_cdc_get_net_changes dazu, dass der anfängliche BEFEHL UPDATE mit einem DELETE- und anschließenden INSERT-Befehl angezeigt wird. Dieses Verhalten ist erforderlich, um den Schlüssel vor und nach der Änderung nachzuverfolgen.

Fehler 313 wird erwartet, wenn der angegebene 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 den Zeitpunkt des niedrigsten LSN oder des 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.

Beispiele

Im folgenden Beispiel wird die Funktion cdc.fn_cdc_get_net_changes_HR_Department verwendet, um die an der Quelltabelle HumanResources.Department vorgenommenen Nettoänderungen 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 durch LSN-Werte begrenzt 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 AdventureWorks2022;  
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