sql >> Database >  >> RDS >> Sqlserver

Wat is "rowversion" in SQL Server?

In SQL Server, rowversion is een gegevenstype dat automatisch gegenereerde, unieke binaire getallen in een database blootlegt. Hiermee kunt u tabelrijen van een versiestempel voorzien met een unieke waarde. Dit helpt de integriteit van de database te behouden wanneer meerdere gebruikers tegelijkertijd rijen bijwerken.

Elke SQL Server-database heeft een teller die wordt verhoogd voor elke invoeg- of updatebewerking die wordt uitgevoerd op een tabel die een kolom bevat met de rowversion gegevenstype (of zijn tijdstempel synoniem, dat is gemarkeerd voor beëindiging).

Als een tabel een rowversion . bevat (of tijdstempel ) kolom, telkens wanneer een rij wordt ingevoegd of bijgewerkt, de waarde van de rowversion kolom is ingesteld op de huidige rowversion-waarde. Dit is waar, zelfs wanneer een UPDATE statement leidt niet tot wijzigingen in de gegevens.

Voorbeeld 1 – Maak een tabel met een rowversion-kolom

Hier is een voorbeeld van het maken van een tabel met een rowversion kolom.

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;

Resultaat:

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)

Bekijk de waarden "Voor" en "Na" in de resultaten. Dit vertegenwoordigt de huidige rijversie waarde.

In dit geval heb ik een nieuwe database en tabel gemaakt, en de rowversion waarde begonnen bij 0x00000000000007D0 . Nadat ik een rij had ingevoegd, werd de rijversie is verhoogd tot 0x00000000000007D1 .

Voorbeeld 2 – Updates

Zoals gezegd, de rowversion waarde wordt ook verhoogd wanneer u een update uitvoert.

Voorbeeld:

SELECT * FROM Pet;

UPDATE Pet
SET PetName = 'Maxine'
WHERE PetId = 1;

SELECT * FROM Pet;

Resultaat:

+---------+-----------+--------------------+
| PetId   | PetName   | VersionStamp       |
|---------+-----------+--------------------|
| 1       | Max       | 0x00000000000007D1 |
+---------+-----------+--------------------+
(1 row affected)
(1 row affected)
+---------+-----------+--------------------+
| PetId   | PetName   | VersionStamp       |
|---------+-----------+--------------------|
| 1       | Maxine    | 0x00000000000007D2 |
+---------+-----------+--------------------+
(1 row affected)

Hier update ik de PetName kolom, en de VersionStamp kolom (rijversie ) wordt verhoogd tot 0x00000000000007D2 .

Voorbeeld 3 – Updates zonder wijzigingen

Een van de leuke dingen van rowversion is dat het wordt verhoogd op alle UPDATE operaties zelfs als er geen verandering plaatsvindt .

Als ik bijvoorbeeld de vorige code opnieuw uitvoer, wordt de waarde van de VersionStamp kolom verandert nog steeds, hoewel er geen wijziging heeft plaatsgevonden:

SELECT * FROM Pet;

UPDATE Pet
SET PetName = 'Maxine'
WHERE PetId = 1;

SELECT * FROM Pet;

Resultaat:

+---------+-----------+--------------------+
| PetId   | PetName   | VersionStamp       |
|---------+-----------+--------------------|
| 1       | Maxine    | 0x00000000000007D2 |
+---------+-----------+--------------------+
(1 row affected)
(1 row affected)
+---------+-----------+--------------------+
| PetId   | PetName   | VersionStamp       |
|---------+-----------+--------------------|
| 1       | Maxine    | 0x00000000000007D3 |
+---------+-----------+--------------------+
(1 row affected)

De waarde van de PetId en PetName kolommen zijn niet veranderd, maar de VersionStamp kolom is verhoogd.

Voorbeeld 4 – Het gegevenstype tijdstempel

Het tijdstempel gegevenstype is een synoniem voor rowversion . Echter, tijdstempel is een van de gegevenstypen die zijn gemarkeerd voor afschaffing in een toekomstige versie van SQL Server. Het is niet verwonderlijk dat Microsoft aanbeveelt om deze functie niet te gebruiken bij nieuw ontwikkelingswerk en om van plan te zijn om applicaties aan te passen die deze functie momenteel gebruiken.

Als u daarom een ​​database tegenkomt die gebruikmaakt van de tijdstempel gegevenstype, kunt u overwegen dit te wijzigen in rowversion .

Alleen voor demonstratiedoeleinden, hier is een wijziging van het eerste voorbeeld om timestamp te gebruiken in plaats van 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;

Resultaat:

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)

En nu we toch bezig zijn, hier is het volgende voorbeeld aangepast voor tijdstempel :

SELECT * FROM Pet;

UPDATE Pet
SET PetName = 'Maxine'
WHERE PetId = 1;

SELECT * FROM Pet;

Resultaat:

+---------+-----------+--------------------+
| PetId   | PetName   | timestamp          |
|---------+-----------+--------------------|
| 1       | Max       | 0x00000000000007D1 |
+---------+-----------+--------------------+
(1 row affected)
(1 row affected)
+---------+-----------+--------------------+
| PetId   | PetName   | timestamp          |
|---------+-----------+--------------------|
| 1       | Maxine    | 0x00000000000007D2 |
+---------+-----------+--------------------+
(1 row affected)

Het is je misschien opgevallen dat ik niet echt een naam heb opgegeven voor de tijdstempel kolom. Als u geen kolomnaam opgeeft, genereert de SQL Server Database Engine de tijdstempel kolomnaam.

Echter, rowversion staat deze syntaxis niet toe, dus u moet de kolomnaam opgeven wanneer u rowversion gebruikt .


  1. UNION-query met het actieve recordpatroon van codeigniter

  2. Exporteer SQLite-database naar XML-bestand

  3. Wat is het verschil tussen zwevend en numeriek/decimaal in SQL Server - SQL Server / T-SQL-zelfstudie, deel 33

  4. Hoe u uw ProxySQL kunt bewaken met Prometheus en ClusterControl