Delen via


Het vastleggen van wijzigingsgegevens in- en uitschakelen

van toepassing op:SQL ServerAzure SQL Managed Instance

In dit artikel wordt beschreven hoe u cdc (Change Data Capture) inschakelt en uitschakelt voor een database en een tabel voor SQL Server en Azure SQL Managed Instance. Zie voor Azure SQL Database CDC met Azure SQL Database.

Machtigingen

De sysadmin machtigingen zijn vereist voor het in- of uitschakelen van het vastleggen van wijzigingsgegevens in SQL Server en Azure SQL Managed Instance.

Inschakelen voor een database

Voordat u een opname-exemplaar voor afzonderlijke tabellen kunt maken, moet u change data capture voor de database inschakelen.

Als u het vastleggen van wijzigingen wilt inschakelen, voert u de opgeslagen procedure uit sys.sp_cdc_enable_db (Transact-SQL) in de databasecontext. Als u wilt bepalen of cdc al is ingeschakeld voor een database, voert u een query uit op de kolom is_cdc_enabled in de sys.databases catalogusweergave.

Wanneer voor een database het vastleggen van gegevenswijzigingen is ingeschakeld, worden het cdc-schema, de cdc-gebruiker, de metagegevenstabellen en andere systeemobjecten voor die database aangemaakt. De cdc--schema bevat de metagegevenstabellen voor het vastleggen van wijzigingengegevens en nadat brontabellen zijn ingeschakeld voor het vastleggen van wijzigingengegevens, dienen de afzonderlijke wijzigingstabellen als opslagplaats voor wijzigingsgegevens. Het cdc- schema bevat ook gekoppelde systeemfuncties die worden gebruikt om query's uit te voeren op wijzigingsgegevens.

Wijzigingsgegevens vastleggen vereist exclusief gebruik van het cdc schema en cdc gebruiker. Als een schema of een databasegebruiker met de naam cdc momenteel in een database bestaat, kan de wijzigingsgegevensopname pas worden ingeschakeld voor de database als het schema en/of de gebruiker is verwijderd of de naam ervan heeft gewijzigd.

-- ====
-- Enable Database for CDC
-- ====
USE MyDB
GO
EXEC sys.sp_cdc_enable_db
GO

Notitie

Als u CDC-gerelateerde sjablonen in SQL Server Management Studio wilt vinden, gaat u naar Weergave, selecteert u Template Explorer-en selecteert u vervolgens SQL Server-sjablonen. Gegevenswijzigingen vastleggen is een submap die sjablonen bevat.

Uitschakelen voor een database

Gebruik sys.sp_cdc_disable_db (Transact-SQL) in de databasecontext om change data capture voor een database uit te schakelen. Het is niet nodig om CDC uit te schakelen voor afzonderlijke tabellen voordat u CDC voor de database uitschakelt. Als u CDC uitschakelt voor de database, worden alle gekoppelde metagegevens voor het vastleggen van wijzigingsgegevens verwijderd, inclusief de cdc gebruiker, schema en de taken voor het vastleggen van wijzigingen. Eventuele gatingsrollen die door CDC zijn gemaakt, worden echter niet automatisch verwijderd en moeten expliciet worden verwijderd. Als u wilt bepalen of een database CDC heeft ingeschakeld, voert u een query uit op de kolom is_cdc_enabled in de sys.databases catalogusweergave.

Als een database met CDC wordt verwijderd, worden de taken voor het vastleggen van wijzigende gegevens automatisch verwijderd.

-- Disable Database for change data capture
USE MyDB
GO
EXEC sys.sp_cdc_disable_db
GO

Inschakelen voor een tabel

Nadat een database is ingeschakeld voor het vastleggen van wijzigingsgegevens, kunnen leden van de db_owner vaste databaserol een opname-exemplaar maken voor afzonderlijke brontabellen met behulp van de opgeslagen procedure sys.sp_cdc_enable_table. Als u wilt bepalen of een brontabel al is ingeschakeld voor het vastleggen van wijzigingsgegevens, bekijkt u de kolom is_tracked_by_cdc in de sys.tables catalogusweergave.

Belangrijk

Zie sys.sp_cdc_enable_table (Transact-SQL)voor meer informatie over de sys.sp_cdc_enable_table opgeslagen procedureargumenten.

De volgende opties kunnen worden opgegeven bij het maken van een capture-exemplaar:

Kolommen in de brontabel die moeten worden opgenomen.

In de standaardinstelling worden alle kolommen in de brontabel gemarkeerd als vastgelegde kolommen. Als alleen een subset van kolommen moet worden bijgehouden, zoals om privacy- of prestatieredenen, gebruikt u de parameter @captured_column_list om de subset van kolommen op te geven.

een bestandsgroep die de wijzigingstabel bevat.

De wijzigingstabel bevindt zich standaard in de standaardbestandsgroep van de database. Database-eigenaren die de plaatsing van afzonderlijke wijzigingstabellen willen beheren, kunnen de parameter @filegroup_name gebruiken om een bepaalde bestandsgroep op te geven voor de wijzigingstabel die is gekoppeld aan het capture-exemplaar. De benoemde bestandsgroep moet al bestaan. Over het algemeen is het raadzaam om tabellen te wijzigen in een bestandsgroep, gescheiden van brontabellen. Zie het Een tabel met de optie Filegroup opgeven sjabloon inschakelen voor een voorbeeld waarin het gebruik van de parameter @filegroup_name wordt weergegeven.

-- Enable CDC for a table specifying filegroup
USE MyDB
GO

EXEC sys.sp_cdc_enable_table
    @source_schema = N'dbo',
    @source_name   = N'MyTable',
    @role_name     = N'MyRole',
    @filegroup_name = N'MyDB_CT',
    @supports_net_changes = 1
GO

een rol voor het beheren van de toegang tot een wijzigingstabel.

Het doel van de benoemde rol is om de toegang tot de wijzigingsgegevens te beheren. De opgegeven rol kan een bestaande vaste serverfunctie of een databaserol zijn. Als de opgegeven rol nog niet bestaat, wordt automatisch een databaserol van die naam gemaakt. Gebruikers moeten een SELECT-machtiging hebben voor alle vastgelegde kolommen van de brontabel. Wanneer een rol is opgegeven, moeten gebruikers die geen lid zijn van de sysadmin- of db_owner rol ook lid zijn van de opgegeven rol.

Als u geen gatingsrol wilt gebruiken, stelt u de parameter @role_name expliciet in op NULL. Zie de -sjabloon "Een tabel inschakelen zonder een gatingsrol" voor een voorbeeld van het inschakelen van een tabel zonder gatingsrol.

-- Enable CDC for a table using a gating role option
USE MyDB
GO
    EXEC sys.sp_cdc_enable_table
    @source_schema = N'dbo',
    @source_name   = N'MyTable',
    @role_name     = NULL,
    @supports_net_changes = 1
GO

een functie om een query uit te voeren op nettowijzigingen.

Een capture-exemplaar bevat altijd een functie met tabelwaarde (TVF) voor het retourneren van alle wijzigingstabelvermeldingen die binnen een gedefinieerd interval zijn opgetreden. Deze functie wordt benoemd door de naam van het capture-exemplaar toe te voegen aan 'cdc.fn_cdc_get_all_changes_'. Zie cdc.fn_cdc_get_all_changes_<capture_instance> (Transact-SQL)voor meer informatie.

Als de parameter @supports_net_changes is ingesteld op 1, wordt er ook een functie voor nettowijzigingen gegenereerd voor het capture-exemplaar. Deze functie retourneert slechts één wijziging voor elke afzonderlijke rij die is gewijzigd in het interval dat is opgegeven in de aanroep. Zie cdc.fn_cdc_get_net_changes_<capture_instance> (Transact-SQL)voor meer informatie.

Ter ondersteuning van query's voor netwijzigingen moet de brontabel een primaire sleutel of unieke index hebben om rijen uniek te identificeren. Als er een unieke index wordt gebruikt, moet de naam van de index worden opgegeven met behulp van de parameter @index_name. De kolommen die zijn gedefinieerd in de primaire sleutel of unieke index, moeten worden opgenomen in de lijst met bronkolommen die moeten worden vastgelegd.

Zie sjabloon Een tabel inschakelen voor alle query's en netwijzigingen voor een voorbeeld dat de creatie demonstreert van een opname-instantie met beide queryfuncties.

-- Enable CDC for a table for all and net changes queries
USE MyDB
GO
EXEC sys.sp_cdc_enable_table
    @source_schema = N'dbo',
    @source_name   = N'MyTable',
    @role_name     = N'MyRole',
    @supports_net_changes = 1
GO

Notitie

Als wijzigingsgegevens vastleggen is ingeschakeld in een tabel met een bestaande primaire sleutel en de parameter @index_name niet wordt gebruikt om een alternatieve unieke index te identificeren, gebruikt de functie voor het vastleggen van wijzigingen de primaire sleutel. Volgende wijzigingen in de primaire sleutel zijn niet toegestaan zonder eerst het vastleggen van wijzigingsgegevens voor de tabel uit te schakelen. Dit geldt ongeacht of er ondersteuning voor query's over netto wijzigingen is aangevraagd toen gegevensregistratie voor wijzigingen werd geconfigureerd. Als er geen primaire sleutel op een tabel is op het moment dat deze is ingeschakeld voor het vastleggen van wijzigingsgegevens, wordt een latere toevoeging van een primaire sleutel genegeerd door vastlegging van wijzigingsgegevens. Omdat het vastleggen van wijzigingen geen primaire sleutel gebruikt die wordt gemaakt nadat de tabel is ingeschakeld, kunnen de sleutel- en sleutelkolommen zonder beperkingen worden verwijderd.

Uitschakelen voor een tabel

Leden van de db_owner vaste databaserol kunnen een opname-exemplaar voor afzonderlijke brontabellen verwijderen met behulp van de opgeslagen procedure sys.sp_cdc_disable_table. Als u wilt bepalen of een brontabel momenteel is ingeschakeld voor het vastleggen van wijzigingen, bekijkt u de kolom is_tracked_by_cdc in de sys.tables catalogusweergave. Als er geen tabellen zijn ingeschakeld voor de database nadat het uitschakelen is uitgevoerd, worden de taken voor het vastleggen van wijzigingen ook verwijderd.

Als een tabel voor het vastleggen van wijzigingen wordt verwijderd, worden metagegevens voor het vastleggen van gegevens die aan de tabel zijn gekoppeld, automatisch verwijderd.

Zie de sjabloon 'Capture Instance uitschakelen voor een tabel' voor een voorbeeld van het uitschakelen van een tabel.

-- Disable a Capture Instance for a table
USE MyDB
GO
    EXEC sys.sp_cdc_disable_table
    @source_schema = N'dbo',
    @source_name   = N'MyTable',
    @capture_instance = N'dbo_MyTable'
GO

Zie ook