I SQL Server, rowversion er en datatype, der afslører automatisk genererede, unikke binære tal i en database. Det giver dig mulighed for at versionsstemple tabelrækker med en unik værdi. Dette hjælper med at bevare databasens integritet, når flere brugere opdaterer rækker på samme tid.
Hver SQL Server-database har en tæller, der øges for hver indsættelses- eller opdateringshandling, der udføres på en tabel, der indeholder en kolonne med rækkeversionen datatype (eller dens tidsstempel synonym, som er markeret for udfasning).
Hvis en tabel indeholder en rækkeversion (eller tidsstempel ) kolonne, hver gang en række indsættes eller opdateres, værdien af rækkeversionen kolonne er indstillet til den aktuelle rækkeversionsværdi. Dette er sandt, selv når en UPDATE
erklæringen resulterer ikke i ændringer af dataene.
Eksempel 1 – Opret en tabel med en rækkeversionskolonne
Her er et eksempel på oprettelse af en tabel med en rækkeversion kolonne.
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)
Tag et kig på "Før" og "Efter" værdierne i resultaterne. Dette repræsenterer den aktuelle rækkeversion værdi.
I dette tilfælde oprettede jeg en ny database og tabel, og rowversionen værdi startet ved 0x00000000000007D0
. Når jeg har indsat en række, rowversionen blev øget til 0x00000000000007D1
.
Eksempel 2 – Opdateringer
Som nævnt er rowversionen værdien øges også, når du foretager en opdatering.
Eksempel:
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)
Her opdaterer jeg PetName
kolonnen og VersionStamp
kolonne (rækkeversion ) øges til 0x00000000000007D2
.
Eksempel 3 – Opdateringer uden ændringer
En af de fede ting ved rowversion er, at det øges på alle UPDATE
operationer selv når ingen ændring finder sted .
For eksempel, hvis jeg kører den forrige kode igen, værdien af VersionStamp
kolonnen ændres stadig, selvom der ikke er sket nogen ændring:
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ærdien af PetId
og PetName
kolonner ændrede sig ikke, men VersionStamp
kolonne blev øget.
Eksempel 4 – Tidsstemplets datatype
tidsstemplet datatype er et synonym for rowversion . Dog tidsstempel er en af de datatyper, der er blevet markeret til udfasning i en fremtidig version af SQL Server. Ikke overraskende anbefaler Microsoft at undgå at bruge denne funktion i nyt udviklingsarbejde og at planlægge at ændre applikationer, der i øjeblikket bruger denne funktion.
Derfor, hvis du støder på en database, der bruger tidsstemplet datatype, vil du måske overveje at ændre den til rowversion .
Bare til demonstrationsformål er her en ændring af det første eksempel for at bruge tidsstempel i stedet for 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)
Og mens vi er i gang, er her det næste eksempel ændret til tidsstempel :
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 har måske bemærket, at jeg faktisk ikke gav et navn til tidsstemplet kolonne. Hvis du ikke angiver et kolonnenavn, genererer SQL Server Database Engine tidsstemplet kolonnenavn.
Dog rowversion tillader ikke denne syntaks, så du bliver nødt til at angive kolonnenavnet, når du bruger rowversion .