rowversion (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do Azure

É um tipo de dados que expõe números binários exclusivos, gerados automaticamente, em um banco de dados. rowversion geralmente é usado como um mecanismo para linhas de tabela de registro de versão. O tamanho do 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 pode ter apenas uma coluna rowversion. Sempre que uma linha com uma coluna rowversion é modificada ou inserida, o valor de rowversion do banco de dados incrementado é inserido na coluna rowversion. Essa propriedade torna uma coluna rowversion uma pobre candidata a chaves, especialmente, 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. O valor de rowversion é incrementado com qualquer instrução de atualização, mesmo se nenhum valor de linha for alterado. (Por exemplo, se um valor de coluna é 5 e uma instrução de atualização define o valor como 5, essa ação é considerada uma atualização, embora não exista nenhuma alteração e a rowversion seja incrementada.)

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

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

Observação

A sintaxe de timestamp foi preterida. Esse recurso será removido em uma versão futura do 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 precisará 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 de rowversion não segue este comportamento. Quando você usar rowversion, precisará especificar um nome de coluna, por exemplo:

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

Observação

Os valores duplicados de rowversion podem ser gerados com a instrução SELECT INTO na qual uma coluna rowversion está na lista SELECT. Não recomendamos o uso de rowversion desta maneira.

Uma coluna rowversion que não permite valor nulo é semanticamente equivalente a uma coluna binary(8). Uma coluna rowversion que permite valor nulo é semanticamente equivalente a uma coluna varbinary(8).

Use a coluna rowversion de uma linha para determinar facilmente se uma declaração de atualização foi executada para a linha desde a última vez em que ela foi lida. Se uma declaração de atualização tiver sido executada na linha, o valor de rowversion será atualizado. Se nenhuma instrução de atualização for executada na linha, o valor de rowversion será igual a quando ele foi lido anteriormente. Para retornar o valor de rowversion atual para um banco de dados, use @@DBTS.

Adicione 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. Popule alguns dados na tabela executando as instruções do 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 do Transact-SQL de exemplo para implementar o controle de simultaneidade otimista na tabela MyTest durante a atualização. O script usa <myRv> para representar o valor de rowversion da última leitura da linha. Substitua o valor pelo valor real de rowversion. Um exemplo de um valor real de rowversion é 0x00000000000007D3.

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

Você também pode colocar as instruções do Transact-SQL do exemplo 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.

Veja a seguir o mesmo exemplo usando a sintaxe de carimbo de data/hora. Substitua <myTS> por um carimbo de data/hora real.

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 = <myTS>;  
IF (SELECT COUNT(*) FROM @t) = 0  
    BEGIN  
        RAISERROR ('error changing row with myKey = %d'  
            ,16 -- Severity.  
            ,1 -- State   
            ,1) -- myKey that was changed   
    END;  

Confira também

ALTER TABLE (Transact-SQL)
CAST e CONVERT (Transact-SQL)
CREATE TABLE (Transact-SQL)
Tipos de dados (Transact-SQL)
DECLARE @local_variable (Transact-SQL)
DELETE (Transact-SQL)
INSERT (Transact-SQL)
MIN_ACTIVE_ROWVERSION (Transact-SQL)
SET @local_variable (Transact-SQL)
UPDATE (Transact-SQL)