I SQL Server, rowversion är en datatyp som exponerar automatiskt genererade, unika binära tal i en databas. Det låter dig versionsstämpla tabellrader med ett unikt värde. Detta hjälper till att upprätthålla databasens integritet när flera användare uppdaterar rader samtidigt.
Varje SQL Server-databas har en räknare som inkrementeras för varje infogning eller uppdatering som utförs på en tabell som innehåller en kolumn med radversionen datatyp (eller dess tidsstämpel synonym, som är flaggad för utfasning).
Om en tabell innehåller en radversion (eller tidsstämpel ) kolumnen, varje gång en rad infogas eller uppdateras, värdet för radversionen kolumnen är inställd på det aktuella radversionsvärdet. Detta är sant, även när en UPDATE
uttalandet resulterar inte i några ändringar av data.
Exempel 1 – Skapa en tabell med en radversionskolumn
Här är ett exempel på hur du skapar en tabell med en radversion kolumn.
CREATE DATABASE Test_rowversion; USE Test_rowversion; CREATE TABLE Pet ( PetId int IDENTITY(1,1) PRIMARY KEY, PetName varchar(255), VersionStamp rowversion ); SELECT @@DBTS AS Before; INSERT INTO Pet (PetName) VALUES ('Max'); SELECT @@DBTS AS After;
Resultat:
Commands completed successfully. Changed database context to 'Test_rowversion'. Commands completed successfully. +--------------------+ | Before | |--------------------| | 0x00000000000007D0 | +--------------------+ (1 row affected) (1 row affected) +--------------------+ | After | |--------------------| | 0x00000000000007D1 | +--------------------+ (1 row affected)
Ta en titt på "Före" och "Efter"-värdena i resultaten. Detta representerar den aktuella radversionen värde.
I det här fallet skapade jag en ny databas och tabell, och rowversionen värde startade på 0x00000000000007D0
. När jag väl infogade en rad, rowversionen ökades till 0x00000000000007D1
.
Exempel 2 – Uppdateringar
Som nämnts, rowversionen värdet ökas också när du gör en uppdatering.
Exempel:
SELECT * FROM Pet; UPDATE Pet SET PetName = 'Maxine' WHERE PetId = 1; SELECT * FROM Pet;
Resultat:
+---------+-----------+--------------------+ | PetId | PetName | VersionStamp | |---------+-----------+--------------------| | 1 | Max | 0x00000000000007D1 | +---------+-----------+--------------------+ (1 row affected) (1 row affected) +---------+-----------+--------------------+ | PetId | PetName | VersionStamp | |---------+-----------+--------------------| | 1 | Maxine | 0x00000000000007D2 | +---------+-----------+--------------------+ (1 row affected)
Här uppdaterar jag PetName
kolumnen och VersionStamp
kolumn (radversion ) ökas till 0x00000000000007D2
.
Exempel 3 – Uppdateringar utan ändringar
En av de coola sakerna med rowversion är att den ökas på alla UPDATE
operationer även när ingen förändring sker .
Till exempel, om jag kör den föregående koden igen, värdet på VersionStamp
kolumnen ändras fortfarande, även om ingen förändring har skett:
SELECT * FROM Pet; UPDATE Pet SET PetName = 'Maxine' WHERE PetId = 1; SELECT * FROM Pet;
Resultat:
+---------+-----------+--------------------+ | PetId | PetName | VersionStamp | |---------+-----------+--------------------| | 1 | Maxine | 0x00000000000007D2 | +---------+-----------+--------------------+ (1 row affected) (1 row affected) +---------+-----------+--------------------+ | PetId | PetName | VersionStamp | |---------+-----------+--------------------| | 1 | Maxine | 0x00000000000007D3 | +---------+-----------+--------------------+ (1 row affected)
Värdet för PetId
och PetName
kolumner ändrades inte, men VersionStamp
kolumnen ökades.
Exempel 4 – Tidsstämpelns datatyp
tidsstämpeln datatyp är en synonym för rowversion . Däremot tidsstämpel är en av de datatyper som har flaggats för utfasning i en framtida version av SQL Server. Inte överraskande rekommenderar Microsoft att man undviker att använda den här funktionen i nytt utvecklingsarbete och att man planerar att modifiera applikationer som för närvarande använder den här funktionen.
Därför, om du stöter på en databas som använder tidsstämpeln datatyp, kanske du vill överväga att ändra den till rowversion .
Bara för demonstrationsändamål, här är en modifiering av det första exemplet för att använda tidsstämpel istället för rowversion :
CREATE DATABASE Test_timestamp; USE Test_timestamp; CREATE TABLE Pet ( PetId int IDENTITY(1,1) PRIMARY KEY, PetName varchar(255), timestamp ); SELECT @@DBTS AS Before; INSERT INTO Pet (PetName) VALUES ('Max'); SELECT @@DBTS AS After;
Resultat:
Commands completed successfully. Changed database context to 'Test_timestamp'. Commands completed successfully. +--------------------+ | Before | |--------------------| | 0x00000000000007D0 | +--------------------+ (1 row affected) (1 row affected) +--------------------+ | After | |--------------------| | 0x00000000000007D1 | +--------------------+ (1 row affected)
Och medan vi ändå håller på, här är nästa exempel modifierat för tidsstämpel :
SELECT * FROM Pet; UPDATE Pet SET PetName = 'Maxine' WHERE PetId = 1; SELECT * FROM Pet;
Resultat:
+---------+-----------+--------------------+ | PetId | PetName | timestamp | |---------+-----------+--------------------| | 1 | Max | 0x00000000000007D1 | +---------+-----------+--------------------+ (1 row affected) (1 row affected) +---------+-----------+--------------------+ | PetId | PetName | timestamp | |---------+-----------+--------------------| | 1 | Maxine | 0x00000000000007D2 | +---------+-----------+--------------------+ (1 row affected)
Du kanske har märkt att jag faktiskt inte angav ett namn för tidsstämpeln kolumn. Om du inte anger ett kolumnnamn genererar SQL Server Database Engine tidsstämpeln kolumnnamn.
Men rowversion tillåter inte denna syntax, så du måste ange kolumnnamnet när du använder rowversion .