Wijzigingen bijhouden beheren (SQL Server)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric

In dit artikel wordt beschreven hoe u wijzigingen bijhouden beheert. Ook wordt beschreven hoe u beveiliging configureert en de gevolgen voor opslag en prestaties bepaalt wanneer wijzigingen bijhouden wordt gebruikt.

Bijhouden van wijzigingen beheren

De volgende secties vermelden catalogusweergaven, machtigingen en instellingen die relevant zijn voor het bijhouden van wijzigingen.

Catalogusweergaven

Gebruik de volgende catalogusweergaven om te bepalen welke tabellen en databases wijzigingen bijhouden zijn ingeschakeld:

De sys.internal_tables catalogusweergave bevat ook de interne tabellen die worden gemaakt wanneer wijzigingen bijhouden is ingeschakeld voor een gebruikerstabel.

Security

Als u toegang wilt krijgen tot informatie over wijzigingen bijhouden met behulp van de functies voor het bijhouden van wijzigingen, moet de principal over de volgende machtigingen beschikken:

  • SELECT machtigingen voor ten minste de kolommen van de primaire sleutel in de tabel waarvoor wijzigingen worden bijgehouden, voor de tabel waarop de query wordt uitgevoerd.

  • VIEW CHANGE TRACKING machtiging voor de tabel waarvoor wijzigingen worden verkregen. De VIEW CHANGE TRACKING machtiging is om de volgende redenen vereist:

    • Records voor het bijhouden van wijzigingen bevatten informatie over rijen die worden verwijderd. De records gebruiken de primaire sleutelwaarden van de rijen die worden verwijderd. Een principal kan worden gemachtigd SELECT voor een bijgehouden wijzigingstabel nadat bepaalde gevoelige gegevens zijn verwijderd. In dit geval wilt u niet dat die principal toegang heeft tot de verwijderde gegevens met behulp van wijzigingen bijhouden.

    • Bijhouden van wijzigingen kan informatie opslaan over welke kolommen worden gewijzigd door updatebewerkingen. Een principal kan de toegang tot een kolom met gevoelige informatie worden geweigerd. Omdat er echter informatie over wijzigingen bijhouden beschikbaar is, kan een principal bepalen dat een kolomwaarde wordt bijgewerkt, maar de principal kan de waarde van de kolom niet bepalen.

Meer informatie over overhead van wijzigingstracering

Wanneer u wijzigingen bijhouden voor een tabel inschakelt, is dit van invloed op bepaalde beheerbewerkingen. De volgende tabel bevat de bewerkingen en de effecten die u moet overwegen.

Operation Wanneer wijzigingen bijhouden is ingeschakeld
DROP TABLE Alle informatie over het bijhouden van wijzigingen voor de verwijderde tabel wordt verwijderd.
ALTER TABLE DROP CONSTRAINT Een poging om de PRIMARY KEY beperking te verwijderen mislukt. U moet het bijhouden van wijzigingen uitschakelen voordat u een PRIMARY KEY beperking kunt verwijderen.
ALTER TABLE DROP COLUMN Als een kolom die u verwijdert deel uitmaakt van de primaire sleutel, is het niet toegestaan die kolom te verwijderen, ongeacht of wijzigingstracking is ingeschakeld.

Als de kolom die u verwijdert geen onderdeel is van de primaire sleutel, wordt de kolom succesvol verwijderd. U moet echter eerst begrijpen wat het effect is op elke toepassing die deze gegevens synchroniseert. Als het bijhouden van wijzigingen in kolommen is ingeschakeld voor de tabel, wordt de verwijderde kolom mogelijk nog steeds geretourneerd als onderdeel van de informatie over het bijhouden van wijzigingen. Het is de verantwoordelijkheid van de toepassing om de verwijderde kolom af te handelen.
ALTER TABLE ADD COLUMN Als u een nieuwe kolom toevoegt aan een tabel waarvoor wijzigingen worden bijgehouden, wordt het toevoegen van die kolom niet bijgehouden. Alleen de updates en wijzigingen die in de nieuwe kolom worden aangebracht, worden bijgehouden.
ALTER TABLE ALTER COLUMN Wijzigingen in het gegevenstype van een kolom die geen primaire sleutel is, worden niet bijgehouden.
ALTER TABLE SWITCH Schakelen tussen partities mislukt als voor een of beide tabellen wijzigingen bijhouden is ingeschakeld.
DROP INDEX, or ALTER INDEX DISABLE De index die de primaire sleutel afdwingt, kan niet worden verwijderd of uitgeschakeld.
TRUNCATE TABLE U kunt een tabel afkappen waarvoor wijzigingen bijhouden is ingeschakeld. De rijen die door de bewerking worden verwijderd, worden echter niet bijgehouden en de minimaal geldige versie wordt bijgewerkt. Wanneer een toepassing de versie controleert, geeft de controle aan dat de versie te oud is en een herinitialisatie is vereist. Deze situatie is hetzelfde als wanneer het bijhouden van wijzigingen voor de tabel wordt uitgeschakeld en vervolgens opnieuw wordt ingeschakeld.

Het bijhouden van wijzigingen zorgt voor extra overhead bij DML-bewerkingen, omdat bij de bewerking informatie voor het bijhouden van wijzigingen wordt opgeslagen.

Effecten op DML

Wijzigingen bijhouden is geoptimaliseerd om de prestatieoverhead voor DML-bewerkingen te minimaliseren. De extra prestatie-overhead die gepaard gaat met het gebruik van wijzigingen bijhouden in een tabel, is vergelijkbaar met de overhead die u hebt wanneer u een index voor een tabel maakt en onderhoudt.

Voor elke rij die een DML-bewerking wijzigt, voegt het systeem een rij toe aan de interne tabel voor het bijhouden van wijzigingen. Het effect van deze actie, ten opzichte van de DML-bewerking, is afhankelijk van verschillende factoren, zoals:

  • Het aantal kolommen van de primaire sleutel

  • De hoeveelheid gegevens die is gewijzigd in de rij van de gebruikerstabel

  • Het aantal bewerkingen dat in een transactie wordt uitgevoerd

Isolatie van momentopnamen, indien gebruikt, heeft ook invloed op de prestaties voor alle DML-bewerkingen, ongeacht of wijzigingen bijhouden is ingeschakeld of niet.

Effecten op opslag

Gegevens voor het bijhouden van wijzigingen worden opgeslagen in de volgende typen interne tabellen:

  • Interne wijzigingstabel

    Elke gebruikerstabel waarvoor wijzigingen bijhouden is ingeschakeld, krijgt een eigen interne wijzigingstabel.

  • Interne transactietabel

    De database heeft één interne transactietabel.

Deze interne tabellen zijn op de volgende manieren van invloed op opslagvereisten:

  • Voor elke wijziging aan elke rij in de gebruikerstabel voegt wijzigingstracering een rij toe aan de interne wijzigingstabel. Deze rij heeft een kleine vaste overhead plus een variabele overhead die gelijk is aan de grootte van de kolommen van de primaire sleutel. De rij kan optionele contextinformatie bevatten die door een toepassing is ingesteld. Als u het bijhouden van kolommen inschakelt, vereist elke gewijzigde kolom 4 bytes in de traceringstabel.

  • Voor elke doorgevoerde transactie voegt wijzigingstracering een rij toe aan een interne transactietabel.

Net als bij andere interne tabellen kunt u de ruimte bepalen die wordt gebruikt voor de tabellen voor het bijhouden van wijzigingen met behulp van de sp_spaceused opgeslagen procedure. U kunt de namen van de interne tabellen ophalen met behulp van de sys.internal_tables catalogusweergave, zoals wordt weergegeven in het volgende voorbeeld.

sp_spaceused 'sys.change_tracking_309576141'  
sp_spaceused 'sys.syscommittab'