Sdílet prostřednictvím


rowversion (Transact-SQL)

platí pro:SQL ServerAzure SQL Databaseazure SQL Managed InstanceSQL Database v Microsoft Fabric

Je datový typ, který v databázi zveřejňuje automaticky generovaná jedinečná binární čísla. rowversion se obecně používá jako mechanismus pro řádky tabulky s razítkem verzí. Velikost úložiště je 8 bajtů. Datový typ rowversion je pouze přírůstkové číslo a nezachovává datum ani čas. Pokud chcete zaznamenat datum nebo čas, použijte datový typ datetime2.

Poznámky

Každá databáze má čítač, který se zvýší pro každou operaci vložení nebo aktualizace prováděnou v tabulce, která obsahuje rowversion sloupec v databázi. Tento čítač je databázovým řádkem. Sleduje relativní čas v databázi, nikoli skutečný čas, který lze přidružit k hodinám. Tabulka může mít pouze jeden sloupec rowversion. Pokaždé, když se změní nebo vloží řádek s sloupcem rowversion, vloží se do sloupce row version hodnota přírůstkové databáze. Tato vlastnost dělá rowversion sloupec špatným kandidátem na klíče, zejména primární klíče. Všechny aktualizace provedené na řádku změní hodnotu rowversion, a proto změní hodnotu klíče. Pokud je sloupec v primárním klíči, stará hodnota klíče už není platná a cizí klíče odkazující na starou hodnotu už nejsou platné. Pokud se na tabulku odkazuje dynamický kurzor, změní všechny aktualizace pozici řádků v kurzoru. Pokud je sloupec v indexovém klíči, všechny aktualizace datového řádku také generují aktualizace indexu. Hodnota rowversion se zvýší pomocí jakéhokoli aktualizačního příkazu, i když se nezmění žádné hodnoty řádků. (Pokud je například hodnota sloupce 5 a příkaz update nastaví hodnotu na 5, považuje se tato akce za aktualizaci, i když neexistuje žádná změna, a rowversion se zvýší.)

časové razítko je synonymem pro datový typ rowversion a podléhá chování synonym datového typu. V příkazech DDL používejte rowversion místo časových razítek všude, kde je to možné. Další informace najdete v tématu synonyma datových typů (Transact-SQL).

Časové razítko Transact-SQL datový typ se liší od časového razítka datového typu definovaného ve standardu ISO.

Poznámka

Syntaxe časového razítka je zastaralá. Tato funkce bude odebrána v budoucí verzi SQL Serveru. Nepoužívejte tuto funkci v nové vývojové práci a naplánujte úpravu aplikací, které tuto funkci aktuálně používají.

V příkazu CREATE TABLE nebo ALTER TABLE není nutné zadat název sloupce pro časové razítko datového typu, například:

CREATE TABLE ExampleTable (PriKey int PRIMARY KEY, timestamp);  

Pokud nezadáte název sloupce, databázový stroj SQL Serveru vygeneruje časové razítko název sloupce; ale synonymum rowversion toto chování neprovádí. Pokud používáte rowversion, musíte zadat název sloupce, například:

CREATE TABLE ExampleTable2 (PriKey int PRIMARY KEY, VerCol rowversion) ;  

Poznámka

Duplicitní hodnoty rowversion lze vygenerovat pomocí příkazu SELECT INTO, ve kterém je sloupec rowversion v seznamu SELECT. Tímto způsobem nedoporučujeme používat rowversion.

Nenulovatelný sloupec rowversion je sémanticky ekvivalentní binárnímu sloupci (8). Sloupec rowversion s možnou hodnotou null je sémanticky ekvivalentní sloupci varbinary(8).

Pomocí sloupce rowversion řádku můžete snadno zjistit, jestli se na řádku od posledního čtení spustil příkaz update. Pokud se na řádku spustí příkaz update, aktualizuje se hodnota rowversion. Pokud nejsou na řádku spuštěny žádné příkazy update, hodnota rowversion je stejná jako při předchozím čtení. Chcete-li vrátit aktuální hodnotu rowversion pro databázi, použijte @@DBTS.

Do tabulky můžete přidat sloupec rowversion, aby se zachovala integrita databáze, když více uživatelů současně aktualizuje řádky. Můžete také chtít zjistit, kolik řádků a které řádky byly aktualizovány, aniž byste znovu dotazovali tabulku.

Předpokládejme například, že vytvoříte tabulku s názvem MyTest. Některá data v tabulce naplníte spuštěním následujících příkazů Transact-SQL.

CREATE TABLE MyTest (myKey int PRIMARY KEY  
    ,myValue int, RV rowversion);  
GO   
INSERT INTO MyTest (myKey, myValue) VALUES (1, 0);  
GO   
INSERT INTO MyTest (myKey, myValue) VALUES (2, 0);  
GO  

Následující ukázkové příkazy Transact-SQL pak můžete použít k implementaci řízení optimistické souběžnosti v tabulce MyTest během aktualizace. Skript používá <myRv> k reprezentaci hodnoty rowversion od posledního čtení řádku. Nahraďte hodnotu skutečnou hodnotou rowversion. Příkladem skutečné hodnoty rowversion je 0x00000000000007D3.

DECLARE @t TABLE (myKey int);  
UPDATE MyTest  
SET myValue = 2  
    OUTPUT inserted.myKey INTO @t(myKey)   
WHERE myKey = 1   
    AND RV = <myRv>;  
IF (SELECT COUNT(*) FROM @t) = 0  
    BEGIN  
        RAISERROR ('error changing row with myKey = %d'  
            ,16 -- Severity.  
            ,1 -- State   
            ,1) -- myKey that was changed   
    END;  

Ukázkové příkazy Transact-SQL můžete také vložit do transakce. Dotazováním proměnné @t v oboru transakce můžete načíst aktualizovaný sloupec myKey tabulky bez opakovaného dotazování MyTest tabulky.

Následující příklad je stejný jako syntaxe časové razítko. Nahraďte <myTS> skutečným časovým razítkem .

CREATE TABLE MyTest2 (myKey int PRIMARY KEY  
    ,myValue int, TS timestamp);  
GO   
INSERT INTO MyTest2 (myKey, myValue) VALUES (1, 0);  
GO   
INSERT INTO MyTest2 (myKey, myValue) VALUES (2, 0);  
GO  
DECLARE @t TABLE (myKey int);  
UPDATE MyTest2  
SET myValue = 2  
    OUTPUT inserted.myKey INTO @t(myKey)   
WHERE myKey = 1   
    AND TS = <myTS>;  
IF (SELECT COUNT(*) FROM @t) = 0  
    BEGIN  
        RAISERROR ('error changing row with myKey = %d'  
            ,16 -- Severity.  
            ,1 -- State   
            ,1) -- myKey that was changed   
    END;  

Viz také

ALTER TABLE (Transact-SQL)
CAST a CONVERT (Transact-SQL)
CREATE TABLE (Transact-SQL)
datových typů (Transact-SQL)
DECLARE @local_variable (Transact-SQL)
DELETE (Transact-SQL)
INSERT (Transact-SQL)
MIN_ACTIVE_ROWVERSION (Transact-SQL)
SET @local_variable (Transact-SQL)
UPDATE (Transact-SQL)