Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Was ist „rowversion“ in SQL Server?

In SQL Server rowversion ist ein Datentyp, der automatisch generierte, eindeutige Binärzahlen innerhalb einer Datenbank verfügbar macht. Es ermöglicht Ihnen, Tabellenzeilen mit einem eindeutigen Wert zu versehen. Dies trägt dazu bei, die Integrität der Datenbank aufrechtzuerhalten, wenn mehrere Benutzer Zeilen gleichzeitig aktualisieren.

Jede SQL Server-Datenbank hat einen Zähler, der für jeden Einfüge- oder Aktualisierungsvorgang erhöht wird, der für eine Tabelle ausgeführt wird, die eine Spalte mit der rowversion enthält Datentyp (oder sein Zeitstempel Synonym, das als veraltet gekennzeichnet ist).

Wenn eine Tabelle eine rowversion enthält (oder Zeitstempel )-Spalte, jedes Mal, wenn eine Zeile eingefügt oder aktualisiert wird, der Wert der rowversion Spalte wird auf den aktuellen Zeilenversionswert gesetzt. Dies gilt auch bei einem UPDATE -Anweisung führt zu keinen Änderungen an den Daten.

Beispiel 1 – Erstellen Sie eine Tabelle mit einer Rowversion-Spalte

Hier ist ein Beispiel für das Erstellen einer Tabelle mit einer rowversion Säule.

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;

Ergebnis:

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)

Sehen Sie sich die „Vorher“- und „Nachher“-Werte in den Ergebnissen an. Dies stellt die aktuelle Zeilenversion dar Wert.

In diesem Fall habe ich eine neue Datenbank und Tabelle und die rowversion erstellt Wert begann bei 0x00000000000007D0 . Sobald ich eine Zeile eingefügt habe, die rowversion wurde auf 0x00000000000007D1 erhöht .

Beispiel 2 – Aktualisierungen

Wie bereits erwähnt, die rowversion Der Wert wird auch erhöht, wenn Sie ein Update durchführen.

Beispiel:

SELECT * FROM Pet;

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

SELECT * FROM Pet;

Ergebnis:

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

Hier aktualisiere ich den PetName Spalte und der VersionStamp Spalte (rowversion ) wird auf 0x00000000000007D2 erhöht .

Beispiel 3 – Updates ohne Änderungen

Eines der coolen Dinge an rowversion ist, dass es bei allen UPDATE inkrementiert wird Operationen auch wenn keine Änderung stattfindet .

Wenn ich beispielsweise den vorherigen Code erneut ausführe, wird der Wert von VersionStamp Spalte ändert sich immer noch, obwohl keine Änderung stattgefunden hat:

SELECT * FROM Pet;

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

SELECT * FROM Pet;

Ergebnis:

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

Der Wert der PetId und PetName Spalten haben sich nicht geändert, aber der VersionStamp Spalte wurde erhöht.

Beispiel 4 – Der Zeitstempel-Datentyp

Der Zeitstempel Datentyp ist ein Synonym für rowversion . Allerdings Zeitstempel ist einer der Datentypen, die in einer zukünftigen Version von SQL Server als veraltet markiert wurden. Es überrascht nicht, dass Microsoft empfiehlt, diese Funktion in neuen Entwicklungsarbeiten nicht zu verwenden und Anwendungen zu ändern, die diese Funktion derzeit verwenden.

Wenn Sie also auf eine Datenbank stoßen, die den Zeitstempel verwendet Datentyp, sollten Sie darüber nachdenken, ihn in rowversion zu ändern .

Nur zu Demonstrationszwecken ist hier eine Modifikation des ersten Beispiels zur Verwendung von timestamp statt 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;

Ergebnis:

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)

Und wo wir schon dabei sind, hier ist das nächste Beispiel, das für timestamp modifiziert wurde :

SELECT * FROM Pet;

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

SELECT * FROM Pet;

Ergebnis:

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

Sie haben vielleicht bemerkt, dass ich eigentlich keinen Namen für den Zeitstempel angegeben habe Säule. Wenn Sie keinen Spaltennamen angeben, generiert die SQL Server-Datenbank-Engine den Zeitstempel Spaltenname.

Allerdings rowversion erlaubt diese Syntax nicht, daher müssen Sie den Spaltennamen angeben, wenn Sie rowversion verwenden .