Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-database in Microsoft Fabric
Geeft wijzigingstrackinginformatie terug voor een tabel. Je kunt deze instructie gebruiken om alle wijzigingen voor een tabel terug te geven of om wijzigingstrackinginformatie voor een specifieke rij terug te geven.
Transact-SQL syntaxis-conventies
Syntaxis
CHANGETABLE (
{ CHANGES <table_name> , <last_sync_version>
| VERSION <table_name> , <primary_key_values> }
, [ FORCESEEK ]
)
[AS] <table_alias> [ ( <column_alias> [ ,...n ] )
<primary_key_values> ::=
( <column_name> [ , ...n ] ) , ( <value> [ , ...n ] )
Arguments
VERANDERINGEN table_name, last_sync_version
Geeft trackinginformatie terug voor alle wijzigingen in een tabel die zijn doorgevoerd sinds de versie die door last_sync_version is gespecificeerd.
table_name
Is de door de gebruiker gedefinieerde tabel waarop gevolgde wijzigingen worden verkregen. Wijzigingstracking moet op tafel ingeschakeld zijn. Een tafelnaam van één, twee, drie of vier delen kan worden gebruikt. De tabelnaam kan een synoniem zijn voor de tabel.
last_sync_version
Een nul-bare bigint-scalaire . Een expressie veroorzaakt een syntaxisfout. Als de waarde NULL is, worden alle bijgehouden wijzigingen teruggegeven.
Wanneer het wijzigingen verkrijgt, moet de aanroepende applicatie het punt specificeren vanaf welk wijzigingspunt vereist is. De last_sync_version specificeert dat punt. De functie geeft informatie terug voor alle rijen die sinds die versie zijn gewijzigd. De applicatie vraagt wijzigingen aan met een versie groter dan last_sync_version.
Gewoonlijk, voordat wijzigingen worden verkregen, roept CHANGE_TRACKING_CURRENT_VERSION() de applicatie de versie aan die gebruikt zal worden bij de volgende keer dat wijzigingen nodig zijn. Daarom hoeft de applicatie de daadwerkelijke waarde niet te interpreteren of te begrijpen. Omdat last_sync_version wordt verkregen door de aanroepende applicatie, moet de applicatie de waarde behouden. Als de applicatie deze waarde verliest, moet deze de data opnieuw initialiseren.
last_sync_version moet worden gevalideerd om te garanderen dat het niet te oud is, omdat sommige of alle wijzigingsinformatie mogelijk is opgeschoond volgens de bewaarperiode die voor de database is ingesteld. Voor meer informatie, zie CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL) en ALTER DATABASE SET Opties (Transact-SQL).
VERSIE table_name, { primary_key_values }
Geeft de meest recente wijzigingstrackinginformatie terug voor een bepaalde rij. Primaire sleutelwaarden moeten de rij identificeren.
primary_key_values identificeert de primaire sleutelkolommen en specificeert de waarden. De kolomnamen van de primaire sleutels kunnen in willekeurige volgorde worden opgegeven.
table_name
Is de door de gebruiker gedefinieerde tabel waarop wijzigingstrackinginformatie wordt verhaald. Wijzigingstracking moet op tafel ingeschakeld zijn. Een tafelnaam van één, twee, drie of vier delen kan worden gebruikt. De tabelnaam kan een synoniem zijn voor de tabel.
column_name
Geeft de naam van de primaire sleutelkolom of kolommen op. Meerdere kolomnamen kunnen in willekeurige volgorde worden gespecificeerd.
value
Is de waarde van de primaire sleutel. Als er meerdere primaire sleutelkolommen zijn, moeten de waarden in dezelfde volgorde worden gespecificeerd als de kolommen in de column_name lijst.
[ FORCESEEK ]
Van toepassing op: SQL Server (beginnend met SQL Server 2016 (13.x) SP2 CU16, SQL Server 2017 (14.x) CU24, en SQL Server 2019 (15.x) CU11), Azure SQL Database en Azure SQL Managed Instance
Optionele parameter die een zoekoperatie dwingt om toegang te krijgen tot de table_name. In sommige gevallen waarin zeer weinig rijen zijn veranderd, kan een scanoperatie nog steeds worden gebruikt om toegang te krijgen tot de table_name. Als een scanoperatie een prestatieprobleem veroorzaakt, gebruik dan de FORCESEEK parameter.
[AS] table_alias [ (column_alias [ ,... n ] ) ]
Geeft namen voor de resultaten die door CHANGETABLE worden teruggegeven.
table_alias
Is de aliasnaam van de tabel die wordt teruggegeven door CHANGETABLE.
table_alias is vereist en moet een geldige identificatie zijn.
column_alias
Is een optionele kolomalias of lijst van kolomaliasen voor de kolommen die door CHANGETABLE worden teruggegeven. Hierdoor kunnen kolomnamen worden aangepast als er dubbele namen in de resultaten voorkomen.
Retourtypen
table
Retourwaarden
WISSELBORDWIJZIGINGEN
Wanneer CHANGES wordt gespecificeerd, worden nul of meer rijen met de volgende kolommen teruggegeven.
| Kolomnaam | Gegevenstype | Description |
|---|---|---|
| SYS_CHANGE_VERSION | bigint | Versiewaarde die gekoppeld is aan de laatste wijziging in de rij |
| SYS_CHANGE_CREATION_VERSION | bigint | Versiewaarden die gekoppeld zijn aan de laatste insert-operatie. |
| SYS_CHANGE_OPERATION | nchar(1) | Specificeert het type wijziging: U = Update I = Invoegen D = Verwijderen |
| SYS_CHANGE_COLUMNS | varbinaire (4100) | Geeft een lijst van de kolommen die sinds de last_sync_version (de basislijn) zijn veranderd. Let op dat berekende kolommen nooit als gewijzigd worden weergegeven. De waarde is NULL wanneer een van de volgende voorwaarden waar is: Kolomwijzigingstracking is niet ingeschakeld. De operatie is een invoeg- of verwijderoperatie. Alle kolommen van niet-primaire sleutels werden in één bewerking bijgewerkt. Deze binaire waarde mag niet direct worden geïnterpreteerd. Gebruik in plaats daarvan CHANGE_TRACKING_IS_COLUMN_IN_MASK() om het te interpreteren. |
| SYS_CHANGE_CONTEXT | varbinary(128) | Verander contextinformatie die je optioneel kunt specificeren door de WITH-clausule te gebruiken als onderdeel van een INSERT-, UPDATE- of DELETE-instructie. |
| <Kolomwaarde van primaire sleutel> | Hetzelfde als de kolommen in de gebruikerstabel | De primaire sleutelwaarden voor de bijgehouden tabel. Deze waarden identificeren elke rij in de gebruikerstabel uniek. |
CHANGETABLE-VERSIE
Wanneer VERSIE wordt opgegeven, wordt één rij met de volgende kolommen teruggegeven.
| Kolomnaam | Gegevenstype | Description |
|---|---|---|
| SYS_CHANGE_VERSION | bigint | Huidige wijzigingsversie die aan de rij is gekoppeld. De waarde is NUL als er een wijziging niet is doorgevoerd gedurende een periode langer dan de wijzigingstracking, of als de rij niet is gewijzigd sinds wijzigingstracking werd ingeschakeld. |
| SYS_CHANGE_CONTEXT | varbinary(128) | Verander contextinformatie die je optioneel kunt specificeren door de WITH-clausule te gebruiken als onderdeel van een INSERT-, UPDATE- of DELETE-instructie. |
| <Kolomwaarde van primaire sleutel> | Hetzelfde als de kolommen in de gebruikerstabel | De primaire sleutelwaarden voor de bijgehouden tabel. Deze waarden identificeren elke rij in de gebruikerstabel uniek. |
Opmerkingen
De CHANGETABLE-functie wordt doorgaans gebruikt in de FROM-clausule van een query alsof het een tabel is.
CHANGETABLE(CHANGES...)
Om rijgegevens te verkrijgen voor nieuwe of gewijzigde rijen, voeg je de resultaatset toe aan de gebruikerstabel door gebruik te maken van de primaire sleutelkolommen. Voor elke wijziging in de gebruikerstabel wordt slechts één rij teruggegeven, zelfs als er sinds de last_sync_version waarde meerdere wijzigingen in dezelfde rij zijn geweest.
Wijzigingen in primaire sleutelkolommen worden nooit als updates gemarkeerd. Als een primaire sleutelwaarde verandert, wordt dit beschouwd als het verwijderen van de oude waarde en een invoeging van de nieuwe waarde.
Als je een rij verwijdert en vervolgens een rij invoegt met de oude primaire sleutel, wordt de wijziging gezien als een update van alle kolommen in die rij.
De waarden die worden teruggegeven voor de SYS_CHANGE_OPERATION kolommen en SYS_CHANGE_COLUMNS de kolommen zijn relatief ten opzichte van de gespecificeerde basislijn (last_sync_version). Als bijvoorbeeld een invoegoperatie is uitgevoerd op versie 10 en een update-operatie op versie 15, en als de basislijn last_sync_version is 12, wordt een update gerapporteerd. Als de last_sync_version waarde is 8, wordt een insert gerapporteerd.
SYS_CHANGE_COLUMNS zal nooit worden gerapporteerd dat berekende kolommen zijn bijgewerkt.
Over het algemeen worden alle bewerkingen die gegevens in gebruikerstabellen invoegen, bijwerken of verwijderen, gevolgd, inclusief de MERGE-instructie.
De volgende bewerkingen die invloed hebben op gebruikerstabelgegevens worden niet gevolgd:
Het uitvoeren van de
UPDATETEXTverklaring. Deze instructie is verouderd en zal in een toekomstige versie van SQL Server worden verwijderd. Wijzigingen die worden aangebracht met de.WRITEclausule van de UPDATE-instructie worden echter bijgehouden.Rijen verwijderen door gebruik te maken van
TRUNCATE TABLE. Wanneer een tabel wordt afgekapt, wordt de versie-informatie voor wijzigingstracking die aan de tabel is gekoppeld gereset alsof wijzigingstracking net op de tabel is ingeschakeld. Een clientapplicatie moet altijd zijn laatst gesynchroniseerde versie valideren. De validatie faalt als de tabel is afgeknot.
CHANGETABLE(VERSIE...)
Een lege resultaatset wordt teruggegeven als een niet-bestaande primaire sleutel wordt gespecificeerd.
De waarde van SYS_CHANGE_VERSION kan NUL zijn als een wijziging niet langer dan de retentieperiode is aangebracht (bijvoorbeeld als de opruiming de wijzigingsinformatie heeft verwijderd) of de rij nooit is gewijzigd sinds wijzigingstracking voor de tabel is ingeschakeld.
Permissions
Vereist de SELECT toestemming voor de primaire sleutelkolommen en VIEW CHANGE TRACKING de toestemming voor de tabel die door de <table_name-waarde> is gespecificeerd om wijzigingstrackinginformatie te verkrijgen.
Voorbeelden
Eén. Rijen teruggeven voor een initiële synchronisatie van data
Het volgende voorbeeld laat zien hoe data te verkrijgen voor een initiële synchronisatie van de tabelgegevens. De query geeft alle rijgegevens en hun bijbehorende versies terug. Je kunt deze data vervolgens toevoegen of toevoegen aan het systeem dat de gesynchroniseerde data zal bevatten.
-- Get all current rows with associated version
SELECT e.[Emp ID], e.SSN, e.FirstName, e.LastName,
c.SYS_CHANGE_VERSION, c.SYS_CHANGE_CONTEXT
FROM Employees AS e
CROSS APPLY CHANGETABLE
(VERSION Employees, ([Emp ID], SSN), (e.[Emp ID], e.SSN)) AS c;
B. Alle wijzigingen die sinds een specifieke versie zijn aangebracht worden opsomd
Het volgende voorbeeld geeft alle wijzigingen weer die in een tabel zijn aangebracht sinds de gespecificeerde versie (@last_sync_version). [Emp ID] en SSN zijn kolommen in een samengestelde primaire sleutel.
DECLARE @last_sync_version bigint;
SET @last_sync_version = <value obtained from query>;
SELECT [Emp ID], SSN,
SYS_CHANGE_VERSION, SYS_CHANGE_OPERATION,
SYS_CHANGE_COLUMNS, SYS_CHANGE_CONTEXT
FROM CHANGETABLE (CHANGES Employees, @last_sync_version) AS C;
C. Alle gewijzigde gegevens verkrijgen voor synchronisatie
Het volgende voorbeeld laat zien hoe je alle data kunt verkrijgen die is veranderd. Deze query voegt de wijzigingstrackinginformatie aan met de gebruikerstabel zodat gebruikerstabelinformatie wordt teruggegeven. A wordt gebruikt zodat een rij wordt teruggegeven voor verwijderde LEFT OUTER JOIN rijen.
-- Get all changes (inserts, updates, deletes)
DECLARE @last_sync_version bigint;
SET @last_sync_version = <value obtained from query>;
SELECT e.FirstName, e.LastName, c.[Emp ID], c.SSN,
c.SYS_CHANGE_VERSION, c.SYS_CHANGE_OPERATION,
c.SYS_CHANGE_COLUMNS, c.SYS_CHANGE_CONTEXT
FROM CHANGETABLE (CHANGES Employees, @last_sync_version) AS c
LEFT OUTER JOIN Employees AS e
ON e.[Emp ID] = c.[Emp ID] AND e.SSN = c.SSN;
D. Conflicten detecteren door gebruik te maken van CHANGETABLE(VERSION...)
Het volgende voorbeeld laat zien hoe een rij alleen bijgewerkt kan worden als de rij sinds de laatste synchronisatie niet is veranderd. Het versienummer van de specifieke rij wordt verkregen door gebruik te maken van CHANGETABLE. Als de rij is bijgewerkt, worden er geen wijzigingen aangebracht en geeft de zoekopdracht informatie terug over de meest recente wijziging in de rij.
-- @last_sync_version must be set to a valid value
UPDATE
SalesLT.Product
SET
ListPrice = @new_listprice
FROM
SalesLT.Product AS P
WHERE
ProductID = @product_id AND
@last_sync_version >= ISNULL (
(SELECT CT.SYS_CHANGE_VERSION FROM
CHANGETABLE(VERSION SalesLT.Product,
(ProductID), (P.ProductID)) AS CT),
0);
Zie ook
functies voor het bijhouden van wijzigingen (Transact-SQL)
Gegevenswijzigingen bijhouden (SQL Server)
CHANGE_TRACKING_IS_COLUMN_IN_MASK (Transact-SQL)
CHANGE_TRACKING_CURRENT_VERSION (Transact-SQL)
CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL)