sys.sp_cdc_enable_table (Transact-SQL)

platí pro:SQL Server

Umožňuje zachytávání změn dat pro zadanou zdrojovou tabulku v aktuální databázi. Když je tabulka povolena pro zachycení změn dat, záznam o každé operaci jazyka pro manipulaci s daty (DML) aplikované na tabulku je zapsán do transakčního logu. Proces zachycování změn získává tyto informace z logu a zapisuje je do tabulek změn, ke kterým se přistupuje pomocí sady funkcí.

Zachycení změn není dostupné ve všech edicích SQL Serveru. Pro seznam funkcí podporovaných edicí v SQL Server viz Edice a podporované funkce SQL Server 2025.

Transact-SQL konvence syntaxe

Syntax

sys.sp_cdc_enable_table
    [ @source_schema = ] N'source_schema'
    , [ @source_name = ] N'source_name'
    [ , [ @capture_instance = ] N'capture_instance' ]
    [ , [ @supports_net_changes = ] supports_net_changes ]
    , [ @role_name = ] N'role_name'
    [ , [ @index_name = ] N'index_name' ]
    [ , [ @captured_column_list = ] N'captured_column_list' ]
    [ , [ @filegroup_name = ] N'filegroup_name' ]
    [ , [ @allow_partition_switch = ] allow_partition_switch ]
    [ , [ @enable_extended_ddl_handling = ] enable_extended_ddl_handling ]
[ ; ]

Arguments

[ @source_schema = ] N'source_schema'

Název schématu, do kterého patří zdrojová tabulka. @source_schema je sysname, bez výchozího nastavení, a nemůže být NULL.

[ @source_name = ] N'source_name'

Název zdrojové tabulky, na které je možné povolit zachycení dat změn. @source_name je sysname bez výchozího nastavení a nemůže být NULL.

@source_name musí existovat v aktuální databázi. Tabulky ve schématu cdc nelze povolit pro zachycování dat o změnách.

[ @capture_instance = ] N'capture_instance'

Název instance zachycení používané k pojmenování objektů pro zachycení změn specifických pro konkrétní instance. @capture_instance je sysname a nemůže být NULL.

Pokud není zadaný, název je odvozen z názvu zdrojového schématu a názvu zdrojové tabulky ve formátu <schemaname>_<sourcename>. @capture_instance nesmí přesáhnout 100 znaků a musí být v databázi jedinečná. Ať už je specifikován nebo odvozen, @capture_instance je očištěn z jakéhokoli bílého prostoru napravo od řetězce.

Zdrojová tabulka může mít maximálně dvě instance zachycení. Pro více informací viz sys.sp_cdc_help_change_data_capture.

[ @supports_net_changes = ] supports_net_changes

Označuje, zda má být pro tuto zachycení instance povolena podpora dotazování na síťové změny. @supports_net_changes je bit s výchozím nastavením, 1 zda má tabulka primární klíč nebo má tabulka jedinečný index, který byl identifikován pomocí parametru @index_name . V opačném případě je parametr výchozí 0hodnotou .

  • Pokud 0, generují se pouze podpůrné funkce pro dotazování na všechny změny.
  • Pokud 1, jsou také generovány funkce potřebné k dotazování na síťové změny.

Pokud je @supports_net_changes nastaveno na 1, @index_name musí být specifikováno, nebo musí mít zdrojová tabulka definovaný primární klíč.

Když je @supports_net_changes nastaveno na 1, se na tabulce změn vytvoří další neshlukovaný index a vytvoří se dotazovací funkce net changes. Protože tento index je třeba udržovat, povolení čistých změn může negativně ovlivnit výkonnost CDC.

[ @role_name = ] N'role_name'

Název databázové role používané k bráně přístupu ke změně dat. @role_name je sysname a musí být specifikován. Pokud je explicitně nastaveno na NULL, se nepoužívá žádná gating role, která by omezila přístup ke změnovým datům.

Pokud role aktuálně existuje, je využita. Pokud role neexistuje, je učiněn pokus vytvořit databázovou roli s tímto specifikovaným názvem. Název role je oříznut z bílého místa napravo od řetězce před pokusem o vytvoření role. Pokud volající není oprávněn vytvořit roli v databázi, operace uložených procedur selže.

[ @index_name = ] N'index_name'

Název unikátního indexu, který slouží k jednoznačné identifikaci řádků ve zdrojové tabulce. @index_name je sysname a může být NULL. Pokud je uvedeno, musí @index_name být platným unikátním indexem ve zdrojové tabulce. Pokud je @index_name specifikováno, identifikované indexové sloupce mají přednost před jakýmikoli definovanými sloupci primárního klíče jako jedinečný identifikátor řádku pro tabulku.

[ @captured_column_list = ] N'captured_column_list'

Identifikuje sloupce zdrojové tabulky, které mají být zahrnuty do tabulky změn. @captured_column_list je nvarchar(max) a může být NULL. Pokud NULL, všechny sloupce jsou zahrnuty v tabulce změn.

Názvy sloupců musí být platné sloupce ve zdrojové tabulce. Sloupce definované v indexu primárního klíče nebo sloupce definované v indexu odkazovaném @index_name musí být zahrnuty.

@captured_column_list je seznam názvů sloupců oddělený čárkami. Názvy jednotlivých sloupců v seznamu lze volitelně citovat buď pomocí dvojitých uvozovek ("") nebo hranatých závorek ([]). Pokud název sloupce obsahuje vloženou čárku, musí být uveden název sloupce.

@captured_column_list nemůže obsahovat následující rezervovaná jména sloupců: __$start_lsn, , __$end_lsn__$seqval, __$operation, a __$update_mask.

[ @filegroup_name = ] N'filegroup_name'

Souborová skupina, která má být použita pro tabulku změn vytvořená pro zachycení instance. @filegroup_name je sysname a může být NULL. Pokud je to specifikováno, musí být @filegroup_name definováno pro aktuální databázi. Pokud NULL, použije se výchozí souborová skupina.

Doporučujeme vytvořit samostatnou skupinu souborů pro tabulky změn dat, zachycení dat.

[ @allow_partition_switch = ] allow_partition_switch

Označuje, zda lze příkaz SWITCH PARTITION z ALTER TABLE funkce spustit na tabulce, která je povolena pro zachycení změn dat. @allow_partition_switch je bit, s výchozím hodnotou 1.

U nerozdělených tabulek je nastavení přepínání vždy 1 a skutečné nastavení je ignorováno. Pokud je přepínač explicitně nastaven na pro 0 nerozdělenou tabulku, je vydáno varování 22857, které signalizuje, že nastavení přepínače bylo ignorováno. Pokud je přepínač explicitně nastaven na pro 0 rozdělenou tabulku, je vydáno varování 22356, které signalizuje, že operace přepínání oddílů na zdrojové tabulce jsou zakázány. Nakonec, pokud je nastavení switche buď explicitně 1 nastaveno, nebo je povoleno jako výchozí 1 a povolená tabulka je rozdělena na partition, je vydáno varování 22855, které signalizuje, že partition switche nebudou blokovány. Pokud dojde k nějakým přepínáním oddílů, zachycení dat změn nesleduje změny vyplývající ze změny. To způsobuje nesrovnalosti v datech, když jsou data o změně spotřebována.

SWITCH PARTITION je operace metadat, ale způsobuje změny dat. Změny dat spojené s touto operací nejsou zachyceny v tabulkách změn pro zachycení dat. Uvažujme tabulku, která má tři oddíly, a na této tabulce se provádějí změny. Proces zachycování sleduje uživatelské operace vkládání, aktualizace a mazání, které jsou prováděny nad tabulkou. Pokud je však oddíl přepnut do jiné tabulky (například při hromadném mazání), řádky, které byly přesunuty v rámci této operace, nejsou v tabulce změn zachyceny jako smazané řádky. Podobně, pokud je do tabulky přidána nová partition s předvyplněnými řádky, tyto řádky se v tabulce změn neprojeví. To může způsobit nekonzistenci dat, když jsou změny aplikací spotřebovány a aplikovány na cíl.

Pokud povolíte přepínání oddílů na SQL Server, možná budete v blízké budoucnosti potřebovat operace rozdělení a slučování. Před provedením operace rozdělení nebo sloučení na replikované nebo CDC povolené tabulce se ujistěte, že v dané partition nejsou žádné čekající replikované příkazy. Měli byste také zajistit, aby se v oddílu během operací rozdělení a sloučení nespustí žádné operace DML. Pokud existují transakce, které čtečka logů nebo CDC zachycovací úloha nezpracovala, nebo pokud jsou DML operace prováděny na oddílu replikované nebo CDC podporované tabulky během provádění operace rozdělení nebo sloučení (zahrnující stejnou partci), může to vést k chybě při zpracování (chyba 608 – Nenalezen katalogový záznam pro ID partition) u agenta čtečky logů nebo CDC capture jobu. Aby bylo možné chybu opravit, může to vyžadovat opětovné inicializaci předplatného nebo zakázání CDC v této tabulce nebo databázi.

[ @enable_extended_ddl_handling = ] enable_extended_ddl_handling

Určeno pouze pro informační účely. Není podporováno. Budoucí kompatibilita není zaručena.

Hodnoty návratového kódu

0 (úspěch) nebo 1 (selhání).

Sada výsledků

Žádné.

Remarks

Než můžete povolit tabulku pro zachycení změn dat, musí být databáze aktivována. Chcete-li zjistit, zda je databáze povolena pro zachycování změn, vyprašujte sloupec is_cdc_enabled v katalogu sys.databases . Pro povolení databáze použijte uloženou proceduru sys.sp_cdc_enable_db .

Když je pro tabulku povoleno zachycení změn dat, vygeneruje se tabulka změn a jedna nebo dvě dotazovací funkce. Tabulka změn slouží jako úložiště pro změny ve zdrojové tabulce extrahované z transakčního logu procesem zachycování. Dotazovací funkce se používají k extrakci dat z tabulky změn. Názvy těchto funkcí jsou odvozeny z parametru @capture_instance následujícími způsoby:

  • Všechny změny fungují: cdc.fn_cdc_get_all_changes_<capture_instance>
  • Funkce čistých změn: cdc.fn_cdc_get_net_changes_<capture_instance>

sys.sp_cdc_enable_table také vytváří úkoly pro zachycení a čištění databáze, pokud je zdrojová tabulka první tabulkou v databázi, která je povolena pro zachycování změn dat, a pro databázi neexistují žádné transakční publikace. Nastaví sloupec is_tracked_by_cdc v pohledu katalogu sys.tables na .1

SQL Server Agent nemusí běžet, když je CDC povoleno pro tabulku. Proces zachycování však nezpracovává transakční log a nezaznamenává záznamy do tabulky změn, pokud není SQL Server Agent spuštěn.

Permissions

Vyžaduje členství v db_owner pevné databázové roli.

Examples

A. Povolte zachycení změn dat zadáním pouze požadovaných parametrů

Následující příklad umožňuje zachytávání dat o změnách pro tabulku HumanResources.Employee . Specifikovány jsou pouze požadované parametry.

USE AdventureWorks2022;
GO

EXECUTE sys.sp_cdc_enable_table
    @source_schema = N'HumanResources',
    @source_name = N'Employee',
    @role_name = N'cdc_Admin';
GO

B. Povolit zachycení změn dat zadáním dalších volitelných parametrů

Následující příklad umožňuje zachytávání dat o změnách pro tabulku HumanResources.Department . Všechny parametry kromě @allow_partition_switch jsou specifikovány.

USE AdventureWorks2022;
GO

EXECUTE sys.sp_cdc_enable_table
    @source_schema = N'HumanResources',
    @source_name = N'Department',
    @role_name = N'cdc_admin',
    @capture_instance = N'HR_Department',
    @supports_net_changes = 1,
    @index_name = N'AK_Department_Name',
    @captured_column_list = N'DepartmentID, Name, GroupName',
    @filegroup_name = N'PRIMARY';
GO