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

Che cos'è "rowversion" in SQL Server?

In SQL Server, rowversion è un tipo di dati che espone numeri binari univoci generati automaticamente all'interno di un database. Ti consente di contrassegnare le righe della tabella con un valore univoco. Questo aiuta a mantenere l'integrità del database quando più utenti aggiornano le righe contemporaneamente.

Ogni database di SQL Server dispone di un contatore che viene incrementato per ogni operazione di inserimento o aggiornamento eseguita su una tabella che contiene una colonna con rowversion tipo di dati (o il relativo timestamp sinonimo, contrassegnato come obsoleto).

Se una tabella contiene una versione di riga (o timestamp ) colonna, ogni volta che viene inserita o aggiornata una riga, il valore di rowversion colonna è impostata sul valore rowversion corrente. Questo è vero, anche quando un UPDATE istruzione non comporta alcuna modifica ai dati.

Esempio 1:creare una tabella con una colonna rowversion

Ecco un esempio di creazione di una tabella con una versione di riga colonna.

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;

Risultato:

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)

Dai un'occhiata ai valori "Prima" e "Dopo" nei risultati. Questo rappresenta la versione di riga corrente valore.

In questo caso ho creato un nuovo database e una nuova tabella e la rowversion valore iniziato a 0x00000000000007D0 . Dopo aver inserito una riga, la rowversion è stato incrementato a 0x00000000000007D1 .

Esempio 2 – Aggiornamenti

Come accennato, la rowversion il valore viene anche incrementato quando si esegue un aggiornamento.

Esempio:

SELECT * FROM Pet;

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

SELECT * FROM Pet;

Risultato:

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

Qui aggiorno il PetName colonna e il VersionStamp colonna (versione riga ) viene incrementato a 0x00000000000007D2 .

Esempio 3 – Aggiornamenti senza modifiche

Una delle cose interessanti di rowversion è che viene incrementato su tutti gli UPDATE operazioni anche quando non avviene alcun cambiamento .

Ad esempio, se eseguo nuovamente il codice precedente, il valore di VersionStamp la colonna cambia ancora, anche se non è stata apportata alcuna modifica:

SELECT * FROM Pet;

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

SELECT * FROM Pet;

Risultato:

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

Il valore di PetId e PetName le colonne non sono cambiate, ma il VersionStamp la colonna è stata incrementata.

Esempio 4:il tipo di dati del timestamp

Il indicatore orario tipo di dati è sinonimo di rowversion . Tuttavia, timestamp è uno dei tipi di dati contrassegnati per la deprecazione in una versione futura di SQL Server. Non sorprende che Microsoft raccomandi di evitare di utilizzare questa funzionalità nei nuovi lavori di sviluppo e di pianificare la modifica delle applicazioni che attualmente utilizzano questa funzionalità.

Pertanto, se incontri un database che utilizza il timestamp tipo di dati, potresti pensare di cambiarlo in rowversion .

Solo a scopo dimostrativo, ecco una modifica del primo esempio per utilizzare timestamp invece di 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;

Risultato:

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)

E già che ci siamo, ecco il prossimo esempio modificato per timestamp :

SELECT * FROM Pet;

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

SELECT * FROM Pet;

Risultato:

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

Potresti aver notato che in realtà non ho fornito un nome per il timestamp colonna. Se non specifichi un nome di colonna, Motore di database di SQL Server genera il timestamp nome della colonna.

Tuttavia, rowversion non consente questa sintassi, quindi dovrai specificare il nome della colonna quando utilizzi rowversion .