cdc.fn_cdc_get_net_changes_<capture_instance> (Transact-SQL)

Gäller för:SQL Server

Returnerar en nettoändringsrad för varje källrad som ändrats inom det angivna intervallet för Log Sequence Numbers (LSN).

Vänta, vad är ett LSN? Varje post i SQL Server:s transaktionslogg identifieras unikt med ett loggsekvensnummer (LSN). LSN är ordnade så att om LSN2 är större än LSN1, inträffade förändringen som beskrivs av loggposten som LSN2 syftar på efter förändringen som beskrivs av loggposten LSN.

LSN för en loggpost där en betydande händelse inträffade kan vara användbar för att konstruera korrekta återställningssekvenser. Eftersom LSN är ordnade kan du jämföra dem för likhet och ojämlikhet (det vill säga, <, >, =, <=, =). > Sådana jämförelser är användbara när man konstruerar återställningssekvenser.

När en källrad har flera förändringar under LSN-intervallet, returneras en enda rad som speglar radens slutgiltiga innehåll av den uppräkningsfunktion som beskrivs nedan. Till exempel, om en transaktion infogar en rad i källtabellen och en efterföljande transaktion inom LSN-intervallet uppdaterar en eller flera kolumner i den raden, returnerar funktionen endast en rad, som inkluderar de uppdaterade kolumnvärdena.

Denna uppräkningsfunktion skapas när en källtabell aktiveras för insamling av ändringsdata och nätspårning specificeras. För att möjliggöra nätspårning måste källtabellen ha en primärnyckel eller unikt index. Funktionsnamnet härleds och använder formatet cdc.fn_cdc_get_net_changes_<capture_instance>, där <capture_instance> är värdet som anges för fångstinstansen när källtabellen aktiverades för ändringsdatainsamling. För mer information, se sys.sp_cdc_enable_table (Transact-SQL).

Transact-SQL syntaxkonventioner

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  
}  

Arguments

from_lsn

LSN som representerar den låga ändpunkten av LSN-intervallet att inkludera i resultatmängden. from_lsn är binary(10).

Endast rader i CDC. capture_instance]_CT ändringstabell med ett värde i __$start_lsn större än eller lika med from_lsn ingår i resultatmängden.

to_lsn

LSN som representerar den högsta ändpunkten för LSN-intervallet som ska inkluderas i resultatmängden. to_lsn är binary(10).

Endast rader i CDC. capture_instance]_CT ändringstabell med ett värde i __$start_lsn mindre än eller lika med from_lsn eller lika med to_lsn ingår i resultatmängden.

<row_filter_option> ::= { alla | alla med mask | alla med sammanslagning }

Ett alternativ som styr innehållet i metadatakolumnerna samt raderna som returneras i resultatuppsättningen. Kan vara något av följande alternativ:

alla
Returnerar LSN för den slutliga ändringen till raden och operationen som behövs för att tillämpa raden i metadatakolumnerna __$start_lsn och __$operation. Kolumnen __$update_mask är alltid NULL.

alla med mask
Returnerar LSN för den slutliga ändringen till raden och operationen som behövs för att tillämpa raden i metadatakolumnerna __$start_lsn och __$operation. Dessutom, när en uppdateringsoperation returnerar (__$operation = 4) markeras de fångade kolumnerna som ändrats i uppdateringen i värdet som returneras i __$update_mask.

allt med sammanslagning
Returnerar LSN för den slutliga ändringen till raden i metadatakolumnerna __$start_lsn. Kolumnen __$operation kommer att vara ett av två värden: 1 för delete och 5 för att indikera att operationen som krävs för att tillämpa ändringen antingen är en insättning eller en uppdatering. Kolumnen __$update_mask är alltid NULL.

Eftersom logiken för att bestämma den exakta operationen för en given ändring ökar frågekomplexiteten, är detta alternativ utformat för att förbättra frågeprestandan när det räcker att indikera att operationen som krävs för att tillämpa ändringsdata är antingen en insättning eller en uppdatering, men det är inte nödvändigt att uttryckligen skilja mellan de två. Detta alternativ är mest attraktivt i målmiljöer där en sammanslagningsoperation är tillgänglig direkt.

Tabellen returneras

Kolumnnamn Datatyp Description
__$start_lsn binary(10) LSN som är associerat med incheckningstransaktionen för ändringen.

Alla ändringar som gjorts i samma transaktion delar samma commit-LSN. Till exempel, om en uppdateringsoperation i källtabellen ändrar två kolumner i två rader, kommer ändringstabellen att innehålla fyra rader, var och en med samma __$start_lsnvalue.
__$operation int Identifierar den DML-åtgärd (Data Manipulation Language) som krävs för att tillämpa raden med ändringsdata på måldatakällan.

Om värdet på row_filter_option-parametern är allt eller alla med mask, kan värdet i denna kolumn vara ett av följande värden:

1 = ta bort

2 = infoga

4 = uppdatering

Om värdet på parametern row_filter_option är helt med merge kan värdet i denna kolumn vara ett av följande värden:

1 = ta bort

5 = infoga eller uppdatera
__$update_mask varbinary(128) En bitmask med en bit som motsvarar varje samlad kolumn som identifieras för avbildningsinstansen. Detta värde har alla definierade bitar satta till 1 när __$operation = 1 eller 2. När __$operation = 3 eller 4 sätts endast de bitar som motsvarar kolumner som ändrats till 1.
<Kolumner för fångade källtabeller> varies De återstående kolumnerna som returneras av funktionen är kolumnerna från källtabellen som identifierades som insamlade kolumner när avbildningsinstansen skapades. Om inga kolumner har angetts i den insamlade kolumnlistan returneras alla kolumner i källtabellen.

Permissions

Kräver medlemskap i sysadmin-rollen som fast server eller db_owner fast databas. För alla andra användare kräver SELECT-behörighet för alla insamlade kolumner i källtabellen och, om en gating-roll för insamlingsinstansen har definierats, medlemskap i den databasrollen. När anroparen inte har behörighet att visa källdatan returnerar funktionen en rad med NULL-värden för alla kolumner.

Remarks

Ändringar i den unika identifieraren för en rad gör fn_cdc_get_net_changes att det initiala UPDATE kommandot visas med ett DELETE och sedan INSERT kommando istället. Detta beteende är nödvändigt för att spåra nyckeln både före och efter ändringen.

Fel 313 förväntas om det LSN-intervallet som tillhandahålls inte är lämpligt vid anrop cdc.fn_cdc_get_all_changes_<capture_instance> eller cdc.fn_cdc_get_net_changes_<capture_instance>. Om parametern lsn_value är längre än tiden för lägsta eller högsta LSN, kommer exekveringen av dessa funktioner att returnera fel 313: Msg 313, Level 16, State 3, Line 1 An insufficient number of arguments were supplied for the procedure or function. Det här felet bör hanteras av utvecklaren.

Examples

Följande exempel använder funktionen cdc.fn_cdc_get_net_changes_HR_Department för att rapportera nettoändringar som gjorts i källtabellen HumanResources.Department under ett specifikt tidsintervall.

Först GETDATE används funktionen för att markera början av tidsintervallet. Efter att flera DML-satser har applicerats på källtabellen GETDATE anropas funktionen igen för att identifiera slutet på tidsintervallet. Funktionen sys.fn_cdc_map_time_to_lsn används sedan för att mappa tidsintervallet till ett change data capture-frågeintervall begränsat av LSN-värden. Slutligen frågas funktionen cdc.fn_cdc_get_net_changes_HR_Department för att erhålla nettoändringarna i källtabellen för tidsintervallet. Observera att raden som infogas och sedan raderas inte förekommer i resultatmängden som funktionen returnerar. Detta beror på att en rad som först läggs till och sedan tas bort inom ett frågefönster inte ger någon nettoförändring i källtabellen för intervallet.

Note

Innan du kör detta exempel måste du först köra exempel B i sys.sp_cdc_enable_table (Transact-SQL) för att aktivera CDC i tabellen HumanResources.Department. I exemplet nedan är HR_Department namnet på CDC:s capture-instans, som specificeras i 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');  

Se även