sql >> Base de Datos >  >> RDS >> Sqlserver

¿Qué es "rowversion" en SQL Server?

En SQL Server, rowversion es un tipo de datos que expone números binarios únicos generados automáticamente dentro de una base de datos. Le permite marcar la versión de las filas de la tabla con un valor único. Esto ayuda a mantener la integridad de la base de datos cuando varios usuarios actualizan filas al mismo tiempo.

Cada base de datos de SQL Server tiene un contador que se incrementa para cada operación de inserción o actualización que se realiza en una tabla que contiene una columna con la rowversion tipo de datos (o su marca de tiempo sinónimo, que está marcado como obsoleto).

Si una tabla contiene una rowversion (o marca de tiempo ), cada vez que se inserta o actualiza una fila, el valor de rowversion la columna se establece en el valor de versión de fila actual. Esto es cierto, incluso cuando un UPDATE declaración no da como resultado ningún cambio en los datos.

Ejemplo 1:crear una tabla con una columna de versión de fila

Este es un ejemplo de cómo crear una tabla con una rowversion columna.

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;

Resultado:

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)

Eche un vistazo a los valores "Antes" y "Después" en los resultados. Esto representa la rowversion actual valor.

En este caso, creé una nueva base de datos y tabla, y la rowversion el valor comenzó en 0x00000000000007D0 . Una vez que inserté una fila, la rowversion se incrementó a 0x00000000000007D1 .

Ejemplo 2:Actualizaciones

Como se mencionó, la rowversion El valor también se incrementa cuando realiza una actualización.

Ejemplo:

SELECT * FROM Pet;

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

SELECT * FROM Pet;

Resultado:

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

Aquí actualizo el PetName columna y el VersionStamp columna (versión de fila ) se incrementa a 0x00000000000007D2 .

Ejemplo 3:actualizaciones sin cambios

Una de las cosas geniales de rowversion es que se incrementa en todos los UPDATE operaciones incluso cuando no se produce ningún cambio .

Por ejemplo, si vuelvo a ejecutar el código anterior, el valor de VersionStamp la columna sigue cambiando, aunque no se produjo ningún cambio:

SELECT * FROM Pet;

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

SELECT * FROM Pet;

Resultado:

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

El valor del PetId y PetName las columnas no cambiaron, pero el VersionStamp se incrementó la columna.

Ejemplo 4:el tipo de datos de marca de tiempo

La marca de tiempo tipo de datos es un sinónimo de rowversion . Sin embargo, marca de tiempo es uno de los tipos de datos que se han marcado como obsoletos en una versión futura de SQL Server. Como era de esperar, Microsoft recomienda evitar el uso de esta función en nuevos trabajos de desarrollo y planificar la modificación de las aplicaciones que actualmente usan esta función.

Por lo tanto, si encuentra una base de datos que utiliza la marca de tiempo tipo de datos, es posible que desee pensar en cambiarlo a rowversion .

Solo con fines de demostración, aquí hay una modificación del primer ejemplo para usar timestamp en lugar 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;

Resultado:

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)

Y mientras estamos en eso, aquí está el siguiente ejemplo modificado para timestamp :

SELECT * FROM Pet;

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

SELECT * FROM Pet;

Resultado:

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

Es posible que haya notado que en realidad no proporcioné un nombre para la marca de tiempo columna. Si no especifica un nombre de columna, el Motor de base de datos de SQL Server genera la marca de tiempo nombre de la columna.

Sin embargo, rowversion no permite esta sintaxis, por lo que deberá especificar el nombre de la columna cuando use rowversion .