Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL 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.
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.WRITEpří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)