Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Vrací jeden řádek čisté změny pro každý zdrojový řádek změněný v rámci určeného rozsahu logaritmických sekvenčních čísel (LSN).
Počkej, co je to LSN? Každý záznam v transakčním logu SQL Server je jednoznačně identifikován sekvenčním číslem logu (LSN). LSN jsou uspořádány tak, že pokud je LSN2 větší než LSN1, změna popsaná logaritmickým záznamem odkazujícím LSN2 nastala po změně popsané logaritmickým záznamem LSN.
LSN záznamu v logu, kde došlo k významné události, může být užitečné pro sestavení správných sekvencí obnovy. Protože LSN jsou uspořádané, lze je porovnat z hlediska rovnosti a nerovnosti (tedy <, , >=, =, <>=). Taková srovnání jsou užitečná při konstrukci sekvencí obnovy.
Když má zdrojový řádek více změn během rozsahu LSN, je jeden řádek, který odráží konečný obsah řádku, vrácen pomocí níže popsané enumerační funkce. Například pokud transakce vloží řádek do zdrojové tabulky a následná transakce v rozsahu LSN aktualizuje jeden nebo více sloupců v tomto řádku, funkce vrátí pouze jeden řádek, který obsahuje aktualizované hodnoty sloupců.
Tato enumerační funkce se vytvoří, když je zdrojová tabulka povolena pro zachycení dat o změnách a je specifikováno sledování sítě. Pro umožnění sledování sítě musí zdrojová tabulka obsahovat primární klíč nebo jedinečný index. Název funkce je odvozen a používá formát cdc.fn_cdc_get_net_changes_<capture_instance>, kde <capture_instance> je hodnota určená pro zachycení instance, když byla zdrojová tabulka povolena pro zachycení změn dat. Pro více informací viz sys.sp_cdc_enable_table (Transact-SQL).
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, které představuje spodní koncový bod rozsahu LSN, je třeba zahrnout do výsledné množiny. from_lsn je binární (10).
Pouze řady v CDC. capture_instance]_CT tabulka změn s hodnotou v __$start_lsn větší nebo rovna from_lsn jsou zahrnuty ve výsledné množině.
to_lsn
LSN, které představuje horní koncový bod rozsahu LSN pro zařazení do výsledné množiny. to_lsn je binární (10).
Pouze řady v CDC. capture_instance]_CT tabulky změn s hodnotou v __$start_lsn menší nebo rovné from_lsn či rovné to_lsn jsou zahrnuty ve výsledné množině.
<row_filter_option> ::= { všichni | vše s maskou | vše s merge }
Možnost, která řídí obsah sloupců metadat i řádky vrácené ve výsledné sadě. Může to být jedna z následujících možností:
vše
Vrátí LSN konečné změny řádku a operaci potřebnou k aplikaci řádku ve sloupcích metadat __$start_lsn a __$. Sloupec __$update_mask je vždy NULL.
Všichni s maskou
Vrátí LSN konečné změny řádku a operaci potřebnou k aplikaci řádku ve sloupcích metadat __$start_lsn a __$. Navíc, když aktualizační operace vrátí (__$operace = 4), zachycené sloupce upravené v aktualizaci jsou označeny hodnotou vrácenou v __$update_mask.
vše s merge
Vrátí LSN poslední změny do řádku ve sloupcích metadat __$start_lsn. Operace ve sloupci __$ bude mít jednu ze dvou hodnot: 1 pro delete a 5 pro označení, že operace potřebná k aplikaci změny je buď vložení, nebo aktualizace. Sloupec __$update_mask je vždy NULL.
Protože logika určení přesné operace pro danou změnu zvyšuje složitost dotazu, je tato možnost navržena tak, aby zlepšila výkon dotazu, pokud stačí uvést, že operace potřebná k aplikaci změnových dat je buď vložení, nebo aktualizace, ale není nutné mezi nimi explicitně rozlišovat. Tato možnost je nejatraktivnější v cílových prostředích, kde je přímo dostupná operace slučování.
Vrácená tabulka
| Název sloupce | Datový typ | Description |
|---|---|---|
| __$start_lsn | binary(10) | LSN přidružené k potvrzení transakce pro změnu. Všechny změny provedené ve stejné transakci sdílejí stejný commit LSN. Například pokud aktualizační operace zdrojové tabulky upraví dva sloupce ve dvou řádcích, tabulka změn bude obsahovat čtyři řádky, každý se stejným __$start_lsnvalue. |
| __$operace | int | Identifikuje operaci jazyka pro manipulaci s daty (DML) potřebnou k použití řádku změn dat na cílový zdroj dat. Pokud je hodnota parametru row_filter_option celá nebo celá s maskou, může být hodnota v tomto sloupci jedna z následujících hodnot: 1 = smazat 2 = vložit 4 = aktualizace Pokud je hodnota parametru row_filter_option všechna s merge, může být hodnota v tomto sloupci jedna z následujících hodnot: 1 = smazat 5 = vložit nebo aktualizovat |
| __$update_mask | varbinary(128) | Bitová maska s bitem odpovídajícím jednotlivým zachyceným sloupcům identifikovaným pro instanci zachycení. Tato hodnota má všechny definované bity nastavené na 1, když __$operace = 1 nebo 2. Když __$operace = 3 nebo 4, na 1 se nastaví pouze bity odpovídající změněným sloupcům. |
| <Zachycené sloupce zdrojové tabulky> | liší se | Zbývající sloupce vrácené funkcí jsou sloupce ze zdrojové tabulky, které byly při vytvoření instance zachycení identifikovány jako zachycené sloupce. Pokud v seznamu zachycených sloupců nebyly zadány žádné sloupce, vrátí se všechny sloupce ve zdrojové tabulce. |
Permissions
Vyžaduje členství v roli správce systému nebo v roli pevného správce db_owner databázi. Pro všechny ostatní uživatele vyžaduje oprávnění SELECT pro všechny zachycené sloupce ve zdrojové tabulce a pokud byla definována role gating pro instanci zachycení, členství v této databázové roli. Pokud volající nemá oprávnění zobrazit zdrojová data, funkce vrátí řádek s hodnotami NULL pro všechny sloupce.
Poznámky
Úpravy jedinečného identifikátoru řádku způsobí fn_cdc_get_net_changes , že se počáteční UPDATE příkaz zobrazí s příkazem a DELETE a then INSERT místo toho. Toto chování je nezbytné pro sledování klíče jak před, tak po změně.
Chyba 313 se očekává, pokud dodaný rozsah LSN není vhodný při volání cdc.fn_cdc_get_all_changes_<capture_instance> nebo cdc.fn_cdc_get_net_changes_<capture_instance>. Pokud je lsn_value parametr za časem nejnižšího nebo nejvyššího LSN, vykonání těchto funkcí vrátí chybu 313: Msg 313, Level 16, State 3, Line 1 An insufficient number of arguments were supplied for the procedure or function. Tuto chybu by měl zpracovat vývojář.
Examples
Následující příklad používá tuto funkci cdc.fn_cdc_get_net_changes_HR_Department k vykazování čistých změn provedených ve zdrojové tabulce HumanResources.Department během konkrétního časového intervalu.
Nejprve GETDATE se funkce používá k označení začátku časového intervalu. Po aplikaci několika DML příkazů na zdrojovou tabulku GETDATE je funkce znovu vyvolána k identifikaci konce časového intervalu. Funkce sys.fn_cdc_map_time_to_lsn se pak použije k mapování časového intervalu na rozsah dotazů pro zachycení změn dat omezený hodnotami LSN. Nakonec je funkce cdc.fn_cdc_get_net_changes_HR_Department dotazována k získání čistých změn ve zdrojové tabulce pro časový interval. Všimněte si, že řádek, který je vložen a poté smazán, se neobjevuje v množině výsledků vrácené funkcí. Je to proto, že řádek, který je nejprve přidán a poté smazán v oknu dotazu, nezpůsobí žádnou čistou změnu ve zdrojové tabulce pro daný interval.
Note
Než spustíte tento příklad, musíte nejprve spustit příklad B v sys.sp_cdc_enable_table (Transact-SQL), abyste povolili CDC v tabulce HumanResources.Department. V níže uvedeném příkladu je HR_Department název instance zachycení CDC, jak je specifikováno v 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');
Související obsah
- 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) - Co je zachytávání dat změn (CDC)?