sql >> Database teknologi >  >> RDS >> Sqlserver

Hvad er "rowversion" i SQL Server?

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 .


  1. Øg værdien i MySQL-opdateringsforespørgsel

  2. Introduktion til diagramtyper

  3. Sådan får du den aktuelle dato og tid (uden tidszone) i PostgreSQL

  4. Rethink Flask – En simpel opgaveliste drevet af Flask og RethinkDB