rowversion (Transact-SQL)

Es un tipo de datos que expone números binarios únicos generados automáticamente en una base de datos. rowversion suele utilizarse como mecanismo para marcar la versión de las filas de la tabla. El tamaño de almacenamiento es de 8 bytes. El tipo de datos rowversion es simplemente un número que se incrementa y no conserva una fecha o una hora. Para registrar una fecha o una hora, use un tipo de datos datetime2.

Notas

Cada base de datos tiene un contador que se incrementa por cada operación de inserción o actualización que se lleva a cabo en una tabla que contiene una columna rowversion en la base de datos. Este contador es la versión de fila (rowversion) de la base de datos. Realiza un seguimiento de una hora relativa de una base de datos, no una hora real que pueda asociarse con un reloj. Una tabla sólo puede tener una columna rowversion. Cada vez que se modifica o inserta una fila con una columna rowversion, el valor rowversion de la base de datos incrementado se inserta en la columna rowversion. Esta propiedad hace que una columna rowversion sea un mal candidato para claves, especialmente claves principales. Cualquier actualización de la fila hace que cambie el valor rowversion, con lo que cambia el valor de la clave. Si la columna está en una clave principal, el valor de la clave principal antigua deja de ser válido, así como las claves externas que hacen referencia al valor antiguo. Si se hace referencia a la tabla en un cursor dinámico, todas las actualizaciones cambian la posición de las filas en el cursor. Si la columna es una clave de índice, todas las actualizaciones de la fila de datos también generan actualizaciones del índice.

timestamp es el sinónimo del tipo de datos rowversion y está sujeto al comportamiento de los sinónimos de tipos de datos. En las instrucciones DDL, utilice rowversion en lugar de timestamp siempre que sea posible. Para obtener más información, vea Sinónimos de tipos de datos (Transact-SQL).

El tipo de datos timestamp de Transact-SQL es distinto del tipo de datos timestamp definido en el estándar ISO.

[!NOTA]

La sintaxis de timestamp se ha quedado obsoleta. Esta característica se quitará en una versión futura de Microsoft SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan.

En una instrucción CREATE TABLE o ALTER TABLE, no tiene que especificar ningún nombre de columna para el tipo de datos timestamp, por ejemplo:

CREATE TABLE ExampleTable (PriKey int PRIMARY KEY, timestamp);

Si no especifica un nombre de columna, el SQL Server Database Engine (Motor de base de datos de SQL Server) genera el nombre de columna timestamp; sin embargo, el sinónimo de rowversion no sigue este comportamiento. Cuando utiliza rowversion, debe especificar un nombre de columna, por ejemplo:

CREATE TABLE ExampleTable2 (PriKey int PRIMARY KEY, VerCol rowversion) ;

[!NOTA]

Se pueden generar valores rowversion duplicados con la instrucción SELECT INTO en la que una columna rowversion está en la lista SELECT. No se recomienda utilizar rowversion de esta manera.

Una columna rowversion que no admite valores NULL equivale semánticamente a una columna binary(8). Una columna rowversion que acepta valores NULL equivale semánticamente a una columna varbinary(8).

Puede utilizar la columna rowversion de una fila para determinar con facilidad si algún valor de la fila ha cambiado desde la última vez que se leyó. Si se ha realizado algún cambio en la fila, el valor rowversion se actualiza. Si no se ha realizado algún cambio en la fila, el valor rowversion es el mismo que en la lectura anterior. Para devolver el valor rowversion actual de una base de datos, utilice @@DBTS.

Puede agregar una columna rowversion a una tabla para ayudar a mantener la integridad de la base de datos cuando varios usuarios actualizan filas al mismo tiempo. También puede que desee conocer cuántas filas y qué filas se actualizaron sin volver a consultar la tabla.

Por ejemplo, suponga que crea una tabla denominada MyTest. Rellena algunos datos en la tabla ejecutando las instrucciones de Transact-SQL siguientes.

CREATE TABLE MyTest (myKey int PRIMARY KEY
    ,myValue int, RV rowversion);
GO 
INSERT INTO MyTest (myKey, myValue) VALUES (1, 0);
GO 
INSERT INTO MyTest (myKey, myValue) VALUES (2, 0);
GO

A continuación, puede utilizar las instrucciones de Transact-SQL de ejemplo siguientes para implementar el control de simultaneidad optimista en la tabla MyTest durante la actualización.

DECLARE @t TABLE (myKey int);
UPDATE MyTest
SET myValue = 2
    OUTPUT inserted.myKey INTO @t(myKey) 
WHERE myKey = 1 
    AND RV = myValue;
IF (SELECT COUNT(*) FROM @t) = 0
    BEGIN
        RAISERROR ('error changing row with myKey = %d'
            ,16 -- Severity.
            ,1 -- State 
            ,1) -- myKey that was changed 
    END;

myValue es el valor de columna rowversion para la fila que indica la última vez que lee la fila. El valor rowversion real debe reemplazar a este valor. Un ejemplo del valor rowversion real es 0x00000000000007D3.

También puede colocar las instrucciones de Transact-SQL de ejemplo en una transacción. Al consultar la variable @t en el ámbito de la transacción, puede recuperar la columna myKey actualizada de la tabla sin consultar de nuevo la tabla MyTest.

A continuación se muestra el mismo ejemplo con la sintaxis de timestamp:

CREATE TABLE MyTest2 (myKey int PRIMARY KEY
    ,myValue int, TS timestamp);
GO 
INSERT INTO MyTest2 (myKey, myValue) VALUES (1, 0);
GO 
INSERT INTO MyTest2 (myKey, myValue) VALUES (2, 0);
GO
DECLARE @t TABLE (myKey int);
UPDATE MyTest2
SET myValue = 2
    OUTPUT inserted.myKey INTO @t(myKey) 
WHERE myKey = 1 
    AND TS = myValue;
IF (SELECT COUNT(*) FROM @t) = 0
    BEGIN
        RAISERROR ('error changing row with myKey = %d'
            ,16 -- Severity.
            ,1 -- State 
            ,1) -- myKey that was changed 
    END;