rowversion (Transact-SQL)

É um tipo de dados que expõe números binários exclusivos gerados automaticamente em um banco de dados. O rowversion geralmente é usado como um mecanismo para linhas de tabelas de carimbo de versão. O tamanho de armazenamento é de 8 bytes. O tipo de dados rowversion é apenas um número que aumenta e não preserva uma data nem hora. Para gravar uma data ou hora, use um tipo de dados datetime2.

Comentários

Cada banco de dados tem um contador que é incrementado para cada operação de inserção ou atualização executada em uma tabela que contém uma coluna rowversion no banco de dados. Esse contador é a rowversion do banco de dados. Isso controla uma hora relativa em um banco de dados, não uma hora real que pode ser associada a um relógio. Uma tabela só pode ter uma coluna rowversion. Sempre que uma linha com uma coluna rowversion é modificada ou inserida, o valor rowversion do banco de dados incrementado é inserido na coluna rowversion. Essa propriedade torna uma coluna rowversion uma pobre candidata a chaves, principalmente chaves primárias. Qualquer atualização feita na linha altera o valor de rowversion e, portanto, altera o valor de chave. Se a coluna estiver em uma chave primária, o valor da chave antiga não será mais válido e as chaves estrangeiras que fazem menção ao valor antigo não serão mais válidas. Se a tabela for mencionada em um cursor dinâmico, todas as atualizações alterarão a posição das linhas no cursor. Se a coluna for uma chave de índice, todas as atualizações na linha de dados também gerarão atualizações do índice.

timestamp é o sinônimo para o tipo de dados rowversion e está sujeito ao comportamento de sinônimos de tipo de dados. Nas instruções DDL, use rowversion em vez de timestamp sempre que possível. Para obter mais informações, consulte Sinônimos de tipo de dados (Transact-SQL).

O tipo de dados Transact-SQLtimestamp é diferente do tipo de dados timestamp definido no padrão de ISO.

ObservaçãoObservação

A sintaxe timestamp é preterida. Esse recurso será removido em uma versão futura do Microsoft SQL Server. Evite usar esse recurso em desenvolvimentos novos e planeje modificar os aplicativos que atualmente o utilizam.

Em uma instrução CREATE TABLE ou ALTER TABLE, você não terá que especificar um nome de coluna para o tipo de dados timestamp, por exemplo:

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

Se você não especificar um nome de coluna, o Mecanismo de Banco de Dados do SQL Server gerará o nome da coluna timestamp; no entanto, o sinônimo rowversion não segue este comportamento. Quando você usar rowversion, você deverá especificar um nome de coluna, por exemplo:

CREATE TABLE ExampleTable2 (PriKey int PRIMARY KEY, VerCol rowversion) ;
ObservaçãoObservação

Os valores duplicados rowversion podem ser gerados usando a instrução SELECT INTO na qual uma coluna rowversion está na lista SELECT. Nós não recomendamos usar rowversion desta maneira.

Uma coluna rowversion não anulável é semanticamente equivalente a uma coluna binary(8). Uma coluna rowversion anulável é semanticamente equivalente a uma coluna varbinary(8).

Você pode usar a coluna rowversion de uma linha para determinar facilmente se algum valor na linha foi alterado desde a última vez que foi lido. Se qualquer alteração for feita na linha, o valor de rowversion será atualizado. Se nenhuma alteração for feita na linha, o valor de rowversion será o mesmo que foi lido anteriormente. Para retornar o valor de rowversion atual para um banco de dados, use @@DBTS.

Você pode adicionar uma coluna rowversion à uma tabela para ajudar a manter a integridade do banco de dados quando vários usuários estão atualizando as linhas ao mesmo tempo: Você também pode querer saber quantas e quais linhas foram atualizadas sem consultar novamente a tabela.

Por exemplo, vamos suporte que você crie uma tabela chamada MyTest. Você popula alguns dados na tabela executando as instruções Transact-SQL a seguir.

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

Em seguida, você pode usar as instruções Transact-SQL de amostra para implementar o controle de simultaneidade otimista na tabela MyTest durante a atualização.

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 é o valor de coluna rowversion para a linha que indica a última vez que você leu a linha. Esse valor deve ser substituído pelo valor de rowversion real. Um exemplo do valor de rowversion real é 0x00000000000007D3.

Você também pode colocar as instruções Transact-SQL de amostra em uma transação. Consultando a variável @t no escopo da transação, você pode recuperar a coluna myKey atualizada da tabela, sem consultar a tabela MyTest.

A seguir, o mesmo exemplo usando a sintaxe 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;