sys.sp_cdc_enable_table (Transact-SQL)

Gäller för:SQL Server

Möjliggör insamling av ändringsdata för den specificerade källtabellen i den aktuella databasen. När en tabell aktiveras för insamling av förändringsdata skrivs en post över varje datamanipulationsspråk (DML)-operation som tillämpas på tabellen till transaktionsloggen. Processen för förändringsdatafångst hämtar denna information från loggen och skriver den till förändringstabeller som nås med hjälp av en uppsättning funktioner.

Ändringsdataregistrering finns inte tillgänglig i varje utgåva av SQL Server. En lista över funktioner som stöds av versionerna av SQL Server finns i Utgåvor och funktioner som stöds i SQL Server 2022.

Transact-SQL syntaxkonventioner

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'

Namnet på det schema som källtabellen tillhör. @source_schema är sysname, utan standard, och kan inte vara NULL.

[ @source_name = ] N'source_name'

Namnet på källtabellen där man aktiverar insamling av förändringsdata. @source_name är sysname, utan standard, och kan inte vara NULL.

@source_name måste finnas i den aktuella databasen. Tabeller i schemat cdc kan inte aktiveras för insamling av ändringsdata.

[ @capture_instance = ] N'capture_instance'

Namnet på den fångstinstans som används för att namnge instansspecifika ändringsdatainsamlingsobjekt. @capture_instance är sysname och kan inte vara NULLdet.

Om det inte anges härleds namnet från källschemanamnet plus källtabellnamnet i formatet <schemaname>_<sourcename>. @capture_instance får inte överstiga 100 tecken och måste vara unik inom databasen. Oavsett om det specificeras eller härleds, trimmas @capture_instance från vilket vitt utrymme som helst till höger om strängen.

En källtabell kan ha maximalt två fångstinstanser. För mer information, se sys.sp_cdc_help_change_data_capture.

[ @supports_net_changes = ] supports_net_changes

Indikerar om stöd för att förfrågas efter nätändringar ska aktiveras för denna fångstinstans. @supports_net_changes är bit med standardinställningen om 1 tabellen har en primärnyckel eller om tabellen har ett unikt index som har identifierats genom att använda parametern @index_name . Annars är parametern standardvärdet 0.

  • Om 0, genereras endast stödfunktionerna för att söka efter alla ändringar.
  • Om 1, genereras också funktionerna som behövs för att söka efter nettoförändringar.

Om @supports_net_changes är satt till 1, måste @index_name specificeras, eller så måste källtabellen ha en definierad primärnyckel.

När @supports_net_changes sätts till 1, skapas ett ytterligare icke-klustrat index i ändringstabellen och frågefunktionen för nätändringar skapas. Eftersom detta index måste upprätthållas kan möjliggörande av nettoförändringar ha en negativ effekt på CDC:s prestation.

[ @role_name = ] N'role_name'

Namnet på databasrollen som används för att grinda åtkomst för att ändra data. @role_name är sysname och måste specificeras. Om det uttryckligen sätts till NULL, används ingen gatingroll för att begränsa åtkomsten till ändringsdata.

Om rollen redan finns används den. Om rollen inte existerar görs ett försök att skapa en databasroll med det angivna namnet. Rollnamnet är bortklippt med vitt utrymme till höger på strängen innan man försöker skapa rollen. Om anroparen inte är auktoriserad att skapa en roll i databasen misslyckas den lagrade proceduren.

[ @index_name = ] N'index_name'

Namnet på ett unikt index att använda för att unikt identifiera rader i källtabellen. @index_name är sysname och kan vara NULL. Om det anges måste @index_name vara ett giltigt unikt index i källtabellen. Om @index_name anges får de identifierade indexkolumnerna företräde framför alla definierade primärnyckelkolumner som den unika radidentifieraren för tabellen.

[ @captured_column_list = ] N'captured_column_list'

Identifierar källtabellskolumnerna som ska inkluderas i ändringstabellen. @captured_column_list är nvarchar(max) och kan vara NULL. Om NULL, inkluderas alla kolumner i ändringstabellen.

Kolumnnamn måste vara giltiga kolumner i källtabellen. Kolumner definierade i ett primärnyckelindex, eller kolumner definierade i ett index som refereras till av @index_name måste inkluderas.

@captured_column_list är en kommaseparerad lista med kolumnnamn. Enskilda kolumnnamn i listan kan valfritt citeras med antingen dubbla citattecken ("") eller hakparenteser ([]). Om ett kolumnnamn innehåller ett inbäddat komma måste kolumnnamnet citeras.

@captured_column_list kan inte innehålla följande reserverade kolumnnamn: __$start_lsn, __$end_lsn, , __$seqval, __$operationoch __$update_mask.

[ @filegroup_name = ] N'filegroup_name'

Filgruppen som ska användas för förändringstabellen skapad för capture-instansen. @filegroup_name är sysname och kan vara NULL. Om det anges måste @filegroup_name definieras för den aktuella databasen. Om NULL, används standardfilgruppen.

Vi rekommenderar att skapa en separat filgrupp för förändringstabeller för ändringsdatafångst.

[ @allow_partition_switch = ] allow_partition_switch

Anger om kommandot SWITCH PARTITION av ALTER TABLE kan utföras mot en tabell som är aktiverad för insamling av förändringsdata. @allow_partition_switch är bit, med standardvärdet .1

För icke-partitionerade tabeller är switchinställningen alltid 1, och den faktiska inställningen ignoreras. Om switchen uttryckligen är inställd på 0 för en icke-partitionerad tabell, utfärdas varning 22857 för att indikera att switchinställningen har ignorerats. Om switchen uttryckligen är inställd på 0 för en partitionerad tabell, utfärdas varningen 22356 för att indikera att partitionsswitchoperationer på källtabellen är otillåtna. Slutligen, om switchinställningen antingen är inställd explicit på 1 eller tillåten att standardvisa och 1 den aktiverade tabellen är partitionerad, utfärdas varning 22855 för att indikera att partitionsswitchar inte kommer att blockeras. Om några partitionsbyten sker spårar inte ändringsdatafångsten de förändringar som uppstår vid bytet. Detta orsakar datainkonsekvenser när ändringsdata konsumeras.

SWITCH PARTITION är en metadataoperation, men den orsakar dataändringar. De dataändringar som är kopplade till denna operation fångas inte i ändringstabellerna för förändringsdatainsamling. Betrakta en tabell som har tre partitioner, och ändringar görs i denna tabell. Inspelningsprocessen spårar användarinsättningar, uppdateringar och borttagningsoperationer som utförs mot tabellen. Men om en partition byts ut till en annan tabell (till exempel för att utföra en bulk-borttagning), fångas inte raderna som flyttades som en del av denna operation som raderade rader i ändringstabellen. På samma sätt, om en ny partition med förfyllda rader läggs till i tabellen, återspeglas inte dessa rader i ändringstabellen. Detta kan orsaka datainkonsistens när ändringarna konsumeras av en applikation och appliceras på en destination.

Om du aktiverar partitionsbyte på SQL Server kan du också behöva split- och merge-operationer inom en snar framtid. Innan du utför en delnings- eller sammanslagningsoperation på en replikerad eller CDC-aktiverad tabell, se till att partitionen inte har några väntande replikerade kommandon. Du bör också se till att inga DML-åtgärder körs på partitionen under delnings- och sammanslagningsåtgärderna. Om det finns transaktioner som loggläsaren eller CDC-fångstjobbet inte har behandlat, eller om DML-operationer utförs på en partition i en replikerad eller CDC-aktiverad tabell medan en delnings- eller sammanslagningsoperation utförs (med samma partition), kan det leda till ett bearbetningsfel (fel 608 – Ingen katalogpost hittad för partitions-ID) med loggläsaragenten eller CDC-fångstjobbet. För att åtgärda felet kan det kräva en ominitiering av prenumerationen eller inaktivering av CDC i tabellen eller databasen.

[ @enable_extended_ddl_handling = ] enable_extended_ddl_handling

Identifieras endast i informationssyfte. Stöds ej. Framtida kompatibilitet garanteras inte.

Returnera kodvärden

0 (lyckades) eller 1 (fel).

Resultatuppsättning

None.

Remarks

Innan du kan aktivera en tabell för dataregistrering måste databasen vara aktiverad. För att avgöra om databasen är aktiverad för insamling av ändringsdata, fråga kolumnen is_cdc_enabled i sys.databases katalogvy. För att aktivera databasen, använd sys.sp_cdc_enable_db stored proceduren.

När förändringsdatafångst aktiveras för en tabell genereras en ändringstabell och en eller två frågefunktioner. Ändringstabellen fungerar som ett arkiv för källtabellens ändringar som extraheras från transaktionsloggen av fångstprocessen. Frågefunktionerna används för att extrahera data från ändringstabellen. Namnen på dessa funktioner härleds från @capture_instance-parametern på följande sätt:

  • Alla ändringar fungerar: cdc.fn_cdc_get_all_changes_<capture_instance>
  • Nettoförändringsfunktionen: cdc.fn_cdc_get_net_changes_<capture_instance>

sys.sp_cdc_enable_table skapar också fångst- och rensningsjobb för databasen om källtabellen är den första tabellen i databasen som aktiveras för ändringsdatainsamling och inga transaktionella publikationer finns för databasen. Den sätter kolumnen is_tracked_by_cdc i sys.tables-katalogvyn till 1.

SQL Server Agent behöver inte köras när CDC är aktiverat för en tabell. Dock bearbetar inte capture-processen transaktionsloggen och skrivposten till ändringstabellen om inte SQL Server Agent körs.

Permissions

Kräver medlemskap i den db_owner fasta databasrollen.

Examples

A. Aktivera insamling av ändringsdata genom att endast ange nödvändiga parametrar

Följande exempel möjliggör insamling av förändringsdata för tabellen HumanResources.Employee . Endast de nödvändiga parametrarna specificeras.

USE AdventureWorks2022;
GO

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

B. Aktivera insamling av ändringsdata genom att specificera ytterligare valfria parametrar

Följande exempel möjliggör insamling av förändringsdata för tabellen HumanResources.Department . Alla parametrar utom @allow_partition_switch anges som angivna.

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