sql >> Databasteknik >  >> RDS >> Sqlserver

Vad är "rowversion" i SQL Server?

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 .


  1. RDBMS vs NoSQL

  2. PostgreSQL:standardnamn för begränsningar

  3. Bokrecension:Benjamin Nevarez:Query Tuning &Optimization

  4. Returnera det aktuella inloggningsnamnet i SQL Server (T-SQL)