Delen via


rowversion (Transact-SQL)

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

Is een gegevenstype dat automatisch gegenereerde, unieke binaire getallen in een database weergeeft. rowversion wordt over het algemeen gebruikt als mechanisme voor tabelrijen met versiestempels. De opslaggrootte is 8 bytes. De rowversion gegevenstype is slechts een oplopend getal en behoudt geen datum of tijd. Als u een datum of tijd wilt opnemen, gebruikt u een datum/tijd2 gegevenstype.

Opmerkingen

Elke database heeft een teller die wordt verhoogd voor elke invoeg- of updatebewerking die wordt uitgevoerd op een tabel die een rowversion kolom in de database bevat. Deze teller is de rijversie van de database. Hiermee wordt een relatieve tijd in een database bijgehouden, niet een werkelijke tijd die aan een klok kan worden gekoppeld. Een tabel kan slechts één rowversion kolom hebben. Telkens wanneer een rij met een rowversion kolom wordt gewijzigd of ingevoegd, wordt de incrementele rowversion-waarde van de database ingevoegd in de rowversion kolom. Deze eigenschap maakt een rowversion kolom een slechte kandidaat voor sleutels, met name primaire sleutels. Elke update die in de rij is aangebracht, wijzigt de rowversion-waarde en wijzigt daarom de sleutelwaarde. Als de kolom zich in een primaire sleutel bevindt, is de oude sleutelwaarde niet meer geldig en zijn refererende sleutels die verwijzen naar de oude waarde niet meer geldig. Als naar de tabel wordt verwezen in een dynamische cursor, worden door alle updates de positie van de rijen in de cursor gewijzigd. Als de kolom zich in een indexsleutel bevindt, genereren alle updates van de gegevensrij ook updates van de index. De rowversion waarde wordt verhoogd met een update-instructie, zelfs als er geen rijwaarden worden gewijzigd. (Als een kolomwaarde bijvoorbeeld 5 is en een update-instructie de waarde instelt op 5, wordt deze actie beschouwd als een update, ook al is er geen wijziging en wordt de rowversion verhoogd.)

tijdstempel is het synoniem voor de rowversion gegevenstype en is onderhevig aan het gedrag van synoniemen van het gegevenstype. Gebruik in DDL-instructies rowversion in plaats van tijdstempel waar mogelijk. Zie synoniemen voor gegevenstypen (Transact-SQL)voor meer informatie.

Het Transact-SQL tijdstempel gegevenstype verschilt van het tijdstempel gegevenstype dat is gedefinieerd in de ISO-standaard.

Notitie

De tijdstempel syntaxis is afgeschaft. Deze functie wordt verwijderd in een toekomstige versie van SQL Server. Vermijd het gebruik van deze functie in nieuwe ontwikkelwerkzaamheden en plan om toepassingen te wijzigen die momenteel gebruikmaken van deze functie.

In een instructie CREATE TABLE of ALTER TABLE hoeft u geen kolomnaam op te geven voor het tijdstempel gegevenstype, bijvoorbeeld:

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

Als u geen kolomnaam opgeeft, genereert de SQL Server Database Engine de tijdstempel kolomnaam; De rowversion synoniem volgt dit gedrag echter niet. Wanneer u rowversiongebruikt, moet u bijvoorbeeld een kolomnaam opgeven:

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

Notitie

Dubbele rowversion waarden kunnen worden gegenereerd met behulp van de INSTRUCTIE SELECT INTO waarin een rowversion kolom in de SELECT-lijst staat. We raden u niet aan om rowversion op deze manier te gebruiken.

Een niet-inullable rowversion kolom is semantisch gelijk aan een binaire(8) kolom. Een nullable rowversion kolom is semantisch gelijk aan een varbinary(8) kolom.

U kunt de rowversion kolom van een rij gebruiken om eenvoudig te bepalen of een update-instructie is uitgevoerd voor de rij sinds de laatste keer dat deze is gelezen. Als een update-instructie wordt uitgevoerd op basis van de rij, wordt de rowversion-waarde bijgewerkt. Als er geen update-instructies worden uitgevoerd voor de rij, is de rowversion-waarde hetzelfde als toen deze eerder werd gelezen. Als u de huidige rowversion-waarde voor een database wilt retourneren, gebruikt u @@DBTS.

U kunt een rowversion kolom toevoegen aan een tabel om de integriteit van de database te behouden wanneer meerdere gebruikers tegelijkertijd rijen bijwerken. Mogelijk wilt u ook weten hoeveel rijen en welke rijen zijn bijgewerkt zonder de tabel opnieuw op te vragen.

Stel dat u een tabel met de naam MyTestmaakt. U vult enkele gegevens in de tabel door de volgende Transact-SQL instructies uit te voeren.

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  

Vervolgens kunt u de volgende voorbeeld-Transact-SQL instructies gebruiken om optimistisch gelijktijdigheidsbeheer te implementeren op de MyTest tabel tijdens de update. Het script gebruikt <myRv> om de rowversion waarde weer te geven vanaf de laatste keer dat u de rij leest. Vervang de waarde door de werkelijke rowversion waarde. Een voorbeeld van een werkelijke rowversion waarde is 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;  

U kunt de voorbeeldinstructies Transact-SQL ook in een transactie plaatsen. Door een query uit te voeren op de @t variabele in het bereik van de transactie, kunt u de bijgewerkte myKey kolom van de tabel ophalen zonder de MyTest tabel opnieuw op te vragen.

Hier volgt hetzelfde voorbeeld met behulp van de syntaxis van de tijdstempel. Vervang <myTS> door een werkelijke tijdstempel.

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;  

Zie ook

ALTER TABLE (Transact-SQL)
CAST en CONVERTEREN (Transact-SQL)
CREATE TABLE (Transact-SQL)
gegevenstypen (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)