cdc.fn_cdc_get_net_changes_<capture_instance> (Transact-SQL)

Van toepassing op:SQL Server

Geeft één nettowijzigingsrij terug voor elke bronrij die binnen het opgegeven Log Sequence Numbers (LSN)-bereik is gewijzigd.

Wacht, wat is een LSN? Elk record in het SQL Server-transactielogboek wordt uniek geïdentificeerd door een logvolgnummer (LSN). LSN's zijn zo geordend dat als LSN2 groter is dan LSN1, de verandering beschreven door het logrecord waarnaar LSN2 verwijst na de wijziging die door het logrecord LSN wordt beschreven.

Het LSN van een logrecord waar een significant voorval heeft plaatsgevonden, kan nuttig zijn voor het construeren van correcte herstelsequenties. Omdat LSN's geordend zijn, kun je ze vergelijken voor gelijkheid en ongelijkheid (dat wil zeggen, <, >, =, <=, =). > Dergelijke vergelijkingen zijn nuttig bij het construeren van herstelsequenties.

Wanneer een bronrij meerdere wijzigingen heeft gedurende het LSN-bereik, wordt een enkele rij die de uiteindelijke inhoud van de rij weerspiegelt teruggegeven door de hieronder beschreven enumeratiefunctie. Als een transactie bijvoorbeeld een rij in de brontabel invoegt en een volgende transactie binnen het LSN-bereik één of meer kolommen in die rij bijwerkt, geeft de functie slechts één rij terug, inclusief de bijgewerkte kolomwaarden.

Deze enumeratiefunctie wordt gecreëerd wanneer een brontabel wordt ingeschakeld voor wijzigingsgegevensopname en nettracking wordt gespecificeerd. Om nettracking mogelijk te maken, moet de brontabel een primaire sleutel of unieke index hebben. De functienaam is afgeleid en gebruikt het formaat cdc.fn_cdc_get_net_changes_<capture_instance>, waarbij <capture_instance> de waarde is die is gespecificeerd voor de capture-instantie toen de brontabel werd ingeschakeld voor wijzigingsgegevensvastlegging. Voor meer informatie, zie sys.sp_cdc_enable_table (Transact-SQL).

Transact-SQL syntaxis-conventies

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

De LSN die het lage eindpunt van het LSN-bereik vertegenwoordigt om in de resultaatset op te nemen. from_lsn is binaire(10).

Alleen rijen in de cdc.[ capture_instance]_CT wijzigingstabel met een waarde in __$start_lsn groter dan of gelijk aan from_lsn worden opgenomen in de resultaatset.

to_lsn

De LSN die het hoogste eindpunt van het LSN-bereik vertegenwoordigt om in de resultaatset op te nemen. to_lsn is binaire(10).

Alleen rijen in de cdc.[ capture_instance]_CT wijzigingstabel met een waarde in __$start_lsn kleiner dan of gelijk aan from_lsn of gelijk aan to_lsn worden opgenomen in de resultaatset.

<row_filter_option> ::= { alle | alle met masker | allemaal met merge }

Een optie die de inhoud van de metadatakolommen beheert, evenals de rijen die in de resultaatset worden teruggegeven. Dit kan een van de volgende opties zijn:

Alles
Geeft het LSN van de laatste wijziging terug aan de rij en de bewerking die nodig is om de rij toe te passen in de metadatakolommen __$start_lsn en __$operatie. De kolom __$update_mask is altijd NULL.

Allen met masker
Geeft het LSN van de laatste wijziging terug aan de rij en de bewerking die nodig is om de rij toe te passen in de metadatakolommen __$start_lsn en __$operatie. Bovendien, wanneer een update-operatie terugkeert (__$operation = 4), worden de vastgelegde kolommen die in de update zijn aangepast gemarkeerd in de waarde die in __$update_mask wordt teruggegeven.

Allemaal met samenvoeging
Geeft het LSN van de laatste wijziging terug aan de rij in de metadatakolommen __$start_lsn. De kolom __$operatie zal een van twee waarden zijn: 1 voor verwijderen en 5 om aan te geven dat de bewerking die nodig is om de wijziging toe te passen ofwel een insert of een update is. De kolom __$update_mask is altijd NULL.

Omdat de logica om de precieze operatie voor een bepaalde wijziging te bepalen de querycomplexiteit verhoogt, is deze optie ontworpen om de queryprestaties te verbeteren wanneer het voldoende is om aan te geven dat de bewerking die nodig is om de wijzigingsgegevens toe te passen een insert of update is, maar het is niet nodig om expliciet onderscheid te maken tussen de twee. Deze optie is het meest aantrekkelijk in doelomgevingen waar een samenvoegingsoperatie direct mogelijk is.

Tabel geretourneerd

Kolomnaam Gegevenstype Description
__$start_lsn binary(10) LSN die is gekoppeld aan de doorvoertransactie voor de wijziging.

Alle wijzigingen die in dezelfde transactie worden uitgevoerd, delen hetzelfde commit LSN. Als bijvoorbeeld een update-operatie op de brontabel twee kolommen in twee rijen wijzigt, zal de wijzigingstabel vier rijen bevatten, elk met dezelfde __$start_lsnvalue.
__$operatie int Identificeert de DML-bewerking (Data Manipulat Language) die nodig is om de rij met wijzigingsgegevens toe te passen op de doelgegevensbron.

Als de waarde van de row_filter_option-parameter volledig of volledig is met masker, kan de waarde in deze kolom een van de volgende waarden zijn:

1 = verwijderen

2 = invoegen

4 = update

Als de waarde van de row_filter_option-parameter volledig met merge is, kan de waarde in deze kolom een van de volgende waarden zijn:

1 = verwijderen

5 = invoegen of bijwerken
__$update_mask varbinary(128) Een bitmasker met een bit die overeenkomt met elke vastgelegde kolom die is geïdentificeerd voor het opname-exemplaar. Deze waarde heeft alle gedefinieerde bits ingesteld op 1 wanneer __$operatie = 1 of 2 is. Wanneer __$operatie = 3 of 4 is, worden alleen die bits die overeenkomen met kolommen die zijn veranderd op 1 gezet.
<Kolommen van gevangen brontabellen> varieert De resterende kolommen die door de functie worden geretourneerd, zijn de kolommen uit de brontabel die zijn geïdentificeerd als vastgelegde kolommen toen het capture-exemplaar werd gemaakt. Als er geen kolommen zijn opgegeven in de vastgelegde kolomlijst, worden alle kolommen in de brontabel geretourneerd.

Permissions

Vereist lidmaatschap van de sysadmin-vaste server rol of db_owner vaste database. Voor alle andere gebruikers is SELECT-machtiging vereist voor alle vastgelegde kolommen in de brontabel en, als er een gatingsrol voor het opnameexemplaren is gedefinieerd, lidmaatschap van die databaserol. Wanneer de aanroeper geen toestemming heeft om de brongegevens te bekijken, geeft de functie een rij met NULL-waarden terug voor alle kolommen.

Remarks

Wijzigingen aan de unieke identificatie van een rij zorgen ervoor dat fn_cdc_get_net_changes het initiële UPDATE commando met een DELETE en daarna INSERT commando wordt weergegeven. Dit gedrag is noodzakelijk om de sleutel zowel vóór als na de wijziging te volgen.

Fout 313 wordt verwacht als het LSN-bereik niet geschikt is bij het aanroepen cdc.fn_cdc_get_all_changes_<capture_instance> van of cdc.fn_cdc_get_net_changes_<capture_instance>. Als de lsn_value parameter voorbij de tijd van de laagste of hoogste LSN ligt, dan zal de uitvoering van deze functies fout 313 teruggeven: Msg 313, Level 16, State 3, Line 1 An insufficient number of arguments were supplied for the procedure or function. Deze fout moet worden verwerkt door de ontwikkelaar.

Examples

Het volgende voorbeeld gebruikt de functie cdc.fn_cdc_get_net_changes_HR_Department om de netto wijzigingen die tijdens een specifiek tijdsinterval aan de brontabel HumanResources.Department zijn aangebracht, te rapporteren.

Ten eerste wordt de GETDATE functie gebruikt om het begin van het tijdsinterval aan te geven. Nadat verschillende DML-instructies op de brontabel zijn toegepast, wordt de GETDATE functie opnieuw aangeroepen om het einde van het tijdinterval te identificeren. De functie sys.fn_cdc_map_time_to_lsn wordt vervolgens gebruikt om het tijdsinterval toe te wijzen op een wijzigingsdata-opname querybereik begrensd door LSN-waarden. Ten slotte wordt de functie cdc.fn_cdc_get_net_changes_HR_Department geraadpleegd om de netto wijzigingen in de brontabel voor het tijdinterval te verkrijgen. Let op dat de rij die wordt ingevoegd en daarna verwijderd niet verschijnt in de resultaatset die door de functie wordt teruggegeven. Dit komt doordat een rij die eerst wordt toegevoegd en daarna verwijderd binnen een queryvenster geen netto verandering veroorzaakt in de brontabel voor het interval.

Note

Voordat je dit voorbeeld uitvoert, moet je eerst voorbeeld B in sys.sp_cdc_enable_table (Transact-SQL ) uitvoeren om CDC in de tabel HumanResources.Departmentin te schakelen. In het onderstaande voorbeeld is HR_Department de naam van de CDC-capture-instantie, zoals gespecificeerd 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');  

Zie ook