Sdílet prostřednictvím


CHANGETABLE (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Vrací informace o sledování změn pro tabulku. Tento příkaz můžete použít k vrácení všech změn v tabulce nebo ke sledování změn pro konkrétní řádek.

Transact-SQL konvence syntaxe

Syntaxe

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

ZMĚNY table_namelast_sync_version
Vrací sledovací informace pro všechny změny tabulky, které nastaly od verze specifikované last_sync_version.

table_name
Je uživatelsky definovaná tabulka, na které lze získat sledované změny. Sledování změn musí být na stole povoleno. Lze použít jednodílný, dvo-, tří- nebo čtyřdílný název tabulky. Název tabulky může být synonymem tabulky.

last_sync_version
Nulovatelná bigintová skalární hodnota. Výraz způsobí chybu v syntaxi. Pokud je hodnota NULL, všechny sledované změny se vrátí. Když aplikace získá změny, musí volající aplikace určit bod, od kterého jsou změny potřebné. last_sync_version to specifikuje. Funkce vrací informace o všech řádcích, které byly od té verze změněny. Aplikace žádá o změny s verzí větší než last_sync_version. Obvykle aplikace před získáním změn volá CHANGE_TRACKING_CURRENT_VERSION() a získá verzi, která bude použita při příští změně. Aplikace proto nemusí interpretovat nebo chápat skutečnou hodnotu. Protože last_sync_version získává volající aplikace, musí aplikace hodnotu zachovat. Pokud aplikace tuto hodnotu ztratí, bude potřeba data znovu inicializovat. last_sync_version by měly být ověřeny, aby se zajistilo, že nejsou příliš staré, protože některé nebo všechny informace o změnách mohly být vyčištěny podle doby uchovávání nakonfigurované pro databázi. Pro více informací viz CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL) a ALTER DATABASE SET Options (Transact-SQL).

VERZE table_name, { primary_key_values }
Vrací nejnovější informace o sledování změn pro zadaný řádek. Primární klíčové hodnoty musí identifikovat daný řádek. primary_key_values identifikuje sloupce primárních klíčů a specifikuje hodnoty. Názvy sloupců primárních klíčů lze zadat v libovolném pořadí.

table_name
Je uživatelsky definovaná tabulka, ve které lze získat informace o sledování změn. Sledování změn musí být na stole povoleno. Lze použít jednodílný, dvo-, tří- nebo čtyřdílný název tabulky. Název tabulky může být synonymem tabulky.

column_name
Specifikuje název sloupce nebo sloupců primárního klíče. Více názvů sloupců lze zadat v libovolném pořadí.

value
je hodnota primárního klíče. Pokud je více sloupců primárního klíče, hodnoty musí být zadány ve stejném pořadí, v jakém se sloupce objevují v seznamu column_name .

[ FORCESEEK ]
Platí na: SQL Server (počínaje SQL Server 2016 (13.x) SP2 CU16, SQL Server 2017 (14.x) CU24 a SQL Server 2019 (15.x) CU11), Azure SQL Database a Azure SQL Managed Instance

Volitelný parametr, který nutí použít operaci hledání k přístupu k table_name. V některých případech, kdy se změnilo jen velmi málo řádků, může být ke table_name stále použita operace skenování. Pokud operace skenování způsobí problém s výkonem, použijte parametr.FORCESEEK

[AS] table_alias [ (column_alias [ ,... n ] ) ]
Poskytuje názvy výsledků, které CHANGETABLE vrací.

table_alias
Je alias název tabulky, kterou CHANGETABLE vrací. table_alias je vyžadováno a musí být platným identifikátorem.

column_alias
Je volitelný alias sloupců nebo seznam sloupcových aliasů pro sloupce, které CHANGETABLE vrací. To umožňuje přizpůsobit názvy sloupců v případě, že jsou ve výsledcích duplicitní názvy.

Návratové typy

table

Návratové hodnoty

ZMĚNY V PROMĚNNÝCH TABULKÁCH

Když je zadán CHANGES, vrátí se nula nebo více řádků s následujícími sloupci.

Název sloupce Datový typ Description
SYS_CHANGE_VERSION bigint Hodnota verze spojená s poslední změnou řádku
SYS_CHANGE_CREATION_VERSION bigint Hodnoty verzí, které jsou spojeny s poslední operací vložení.
SYS_CHANGE_OPERATION nchar(1) Specifikuje typ změny:

U = Aktualizace

I = Vložit

D = Smazat
SYS_CHANGE_COLUMNS varbinární (4100) Uvádí sloupce, které se od last_sync_version (základní čáry) změnily. Všimněte si, že vypočtené sloupce nejsou nikdy uvedeny jako změněné.

Hodnota je NULL, pokud je splněna některá z následujících podmínek:

Sledování změny sloupců není zapnuté.

Operace je operace vložení nebo odstranění.

Všechny sloupce neprimárních klíčů byly aktualizovány v jedné operaci. Tato binární hodnota by neměla být interpretována přímo. Místo toho ji interpretujte pomocí CHANGE_TRACKING_IS_COLUMN_IN_MASK().
SYS_CHANGE_CONTEXT varbinary(128) Změňte kontextové informace, které můžete volitelně specifikovat pomocí klauzule WITH jako součásti příkazů INSERT, UPDATE nebo DELETE.
<Hodnota sloupce primárního klíče> Stejně jako sloupce uživatelské tabulky Primární klíčové hodnoty pro sledovanou tabulku. Tyto hodnoty jednoznačně identifikují každý řádek v uživatelské tabulce.

CHANGETABLE VERZE

Když je specifikována VERZE, vrátí se jeden řádek s následujícími sloupci.

Název sloupce Datový typ Description
SYS_CHANGE_VERSION bigint Aktuální změna verze hodnoty, která je spojena s řádkem.

Hodnota je NULL, pokud změna nebyla provedena delší dobu než je doba sledování změn, nebo pokud řádek nebyl změněn od doby, kdy bylo sledování změn povoleno.
SYS_CHANGE_CONTEXT varbinary(128) Změňte kontextové informace, které můžete volitelně specifikovat pomocí klauzule WITH jako součásti příkazů INSERT, UPDATE nebo DELETE.
<Hodnota sloupce primárního klíče> Stejně jako sloupce uživatelské tabulky Primární klíčové hodnoty pro sledovanou tabulku. Tyto hodnoty jednoznačně identifikují každý řádek v uživatelské tabulce.

Poznámky

Funkce CHANGETABLE se obvykle používá v klauzuli FROM dotazu, jako by šlo o tabulku.

CHANGETABLE(CHANGES...)

Pro získání dat o řádkech pro nové nebo upravené řádky připojte výslednou sadu k uživatelské tabulce pomocí sloupců primárního klíče. Pro každý řádek v uživatelské tabulce, který byl změněn, se vrací pouze jeden řádek, i když od hodnoty last_sync_version došlo ke více změnám ve stejném řádku.

Změny sloupců primárního klíče se nikdy neoznačují jako aktualizace. Pokud se změní hodnota primárního klíče, považuje se to za odstranění staré hodnoty a vložení nové hodnoty.

Pokud smažete řádek a pak vložíte řádek se starým primárním klíčem, změna se považuje za aktualizaci všech sloupců v řádku.

Hodnoty vrácené pro SYS_CHANGE_OPERATION sloupce a SYS_CHANGE_COLUMNS jsou relativní k specifikované základní ose (last_sync_version). Například pokud byla provedena operace vložení ve verzi 10 a aktualizace operace ve verzi 15, a pokud je základní last_sync_version , 12bude hlášena aktualizace. Pokud je hodnota last_sync_version , 8bude nahlášena vložka. SYS_CHANGE_COLUMNS nikdy nebude hlásit vypočtené sloupce jako aktualizované.

Obecně jsou sledovány všechny operace, které vkládají, aktualizují nebo mazou data v uživatelských tabulkách, včetně příkazu MERGE.

Následující operace, které ovlivňují uživatelská tabulková data, nejsou sledovány:

  • Vykonávání výpovědi UPDATETEXT . Toto prohlášení je zastaralé a bude odstraněno v budoucí verzi SQL Serveru. Nicméně změny, které jsou provedeny pomocí klauzule .WRITE příkazu UPDATE, jsou sledovány.

  • Mazání řádků pomocí TRUNCATE TABLE. Když je tabulka zkrácena, informace o verzi sledování změn, které jsou s tabulkou spojeny, se resetují, jako by sledování změn bylo právě na tabulce povoleno. Klientská aplikace by měla vždy ověřit svou poslední synchronizovanou verzi. Validace selže, pokud byla tabulka zkrácena.

CHANGETABLE (VERZE...)

Pokud je zadán neexistující primární klíč, je vrácena prázdná výsledná množina.

Hodnota může SYS_CHANGE_VERSION být NULL, pokud změna nebyla provedena déle než doba udržení (například úklid odstranil informace o změně) nebo pokud řádek nebyl nikdy změněn od doby, kdy bylo sledování změn pro tabulku povoleno.

Povolení

Vyžaduje SELECT povolení na sloupce primárního klíče a VIEW CHANGE TRACKING povolení k tabulce specifikované hodnotou <table_name> pro získání informací o sledování změn.

Examples

A. Vrácení řádků pro počáteční synchronizaci dat

Následující příklad ukazuje, jak získat data pro počáteční synchronizaci tabulových dat. Dotaz vrací všechna řádková data a jejich příslušné verze. Poté můžete tato data vložit nebo přidat do systému, který bude obsahovat synchronizovaná data.

-- 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. Seznam všech změn, které byly provedeny od konkrétní verze

Následující příklad uvádí všechny změny, které byly provedeny v tabulce od specifikované verze (@last_sync_version). [Emp ID] a SSN jsou sloupce v kompozitním primárním klíči.

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. Získání všech změněných dat pro synchronizaci

Následující příklad ukazuje, jak můžete získat všechna změněná data. Tento dotaz spojuje informace o sledování změn s uživatelskou tabulkou, takže jsou vráceny informace o uživatelské tabulce. A LEFT OUTER JOIN se používá proto, aby se pro smazané řádky vrátil řádek.

-- 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. Detekce konfliktů pomocí CHANGETABLE(VERSION...)

Následující příklad ukazuje, jak aktualizovat řádek pouze tehdy, pokud se řádek od poslední synchronizace nezměnil. Číslo verze konkrétního řádku se získá použitím .CHANGETABLE Pokud byl řádek aktualizován, změny nejsou provedeny a dotaz vrací informace o nejnovější změně řádku.

-- @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);  

Viz také

Funkce sledování změn (Transact-SQL)
sledování změn dat (SQL Server)
CHANGE_TRACKING_IS_COLUMN_IN_MASK (Transact-SQL)
CHANGE_TRACKING_CURRENT_VERSION (Transact-SQL)
CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL)