Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Qu'est-ce que "rowversion" dans SQL Server ?

Dans SQL Server, rowversion est un type de données qui expose des nombres binaires uniques générés automatiquement dans une base de données. Il vous permet d'horodater les lignes de la table avec une valeur unique. Cela permet de maintenir l'intégrité de la base de données lorsque plusieurs utilisateurs mettent à jour des lignes en même temps.

Chaque base de données SQL Server a un compteur qui est incrémenté pour chaque opération d'insertion ou de mise à jour effectuée sur une table contenant une colonne avec la rowversion type de données (ou son horodatage synonyme, qui est marqué pour obsolescence).

Si une table contient une rowversion (ou horodatage ) colonne, chaque fois qu'une ligne est insérée ou mise à jour, la valeur de la rowversion colonne est définie sur la valeur de version de ligne actuelle. Cela est vrai, même lorsqu'un UPDATE l'instruction n'entraîne aucune modification des données.

Exemple 1 - Créer un tableau avec une colonne rowversion

Voici un exemple de création d'un tableau avec une rowversion colonne.

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;

Résultat :

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)

Jetez un œil aux valeurs "Avant" et "Après" dans les résultats. Cela représente la rowversion actuelle valeur.

Dans ce cas, j'ai créé une nouvelle base de données et une nouvelle table, et la rowversion valeur commençant à 0x00000000000007D0 . Une fois que j'ai inséré une ligne, la rowversion a été incrémenté à 0x00000000000007D1 .

Exemple 2 – Mises à jour

Comme mentionné, la rowversion La valeur est également incrémentée lorsque vous effectuez une mise à jour.

Exemple :

SELECT * FROM Pet;

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

SELECT * FROM Pet;

Résultat :

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

Ici, je mets à jour le PetName et la colonne VersionStamp colonne (rowversion ) est incrémenté à 0x00000000000007D2 .

Exemple 3 – Mises à jour sans modification

L'une des choses intéressantes à propos de rowversion c'est qu'il est incrémenté sur tous les UPDATE opérations même lorsqu'aucun changement n'a lieu .

Par exemple, si j'exécute à nouveau le code précédent, la valeur de VersionStamp la colonne change toujours, même si aucun changement n'a eu lieu :

SELECT * FROM Pet;

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

SELECT * FROM Pet;

Résultat :

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

La valeur de PetId et PetName les colonnes n'ont pas changé, mais le VersionStamp colonne a été incrémentée.

Exemple 4 - Le type de données d'horodatage

L'horodatage le type de données est synonyme de rowversion . Cependant, horodatage est l'un des types de données signalés comme obsolètes dans une future version de SQL Server. Sans surprise, Microsoft recommande d'éviter d'utiliser cette fonctionnalité dans de nouveaux travaux de développement et de prévoir de modifier les applications qui utilisent actuellement cette fonctionnalité.

Par conséquent, si vous rencontrez une base de données qui utilise l'horodatage type de données, vous voudrez peut-être penser à le changer en rowversion .

Juste à des fins de démonstration, voici une modification du premier exemple pour utiliser timestamp au lieu de 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;

Résultat :

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)

Et pendant que nous y sommes, voici l'exemple suivant modifié pour timestamp :

SELECT * FROM Pet;

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

SELECT * FROM Pet;

Résultat :

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

Vous avez peut-être remarqué que je n'ai pas fourni de nom pour l'horodatage colonne. Si vous ne spécifiez pas de nom de colonne, le moteur de base de données SQL Server génère l'horodatage nom de la colonne.

Cependant, rowversion n'autorise pas cette syntaxe, vous devrez donc spécifier le nom de la colonne lors de l'utilisation de rowversion .