Partilhar via


versão de linha (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada SQL do Azurebanco de dados SQL no Microsoft Fabric

É um tipo de dados que expõe números binários exclusivos gerados automaticamente dentro de um banco de dados. de versão de linha é geralmente usado como um mecanismo para carimbar as linhas da tabela. O tamanho do armazenamento é de 8 bytes. O rowversion tipo de dados é apenas um número de incremento e não preserva uma data ou hora. Para registrar uma data ou hora, use um datetime2 tipo de dados.

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 dentro do banco de dados. Esse contador é a versão de linha do banco de dados. Isso rastreia um tempo relativo dentro de um banco de dados, não um tempo real que pode ser associado a um relógio. Uma tabela pode ter apenas uma versão de linha coluna. Sempre que uma linha com uma coluna rowversion é modificada ou inserida, o valor rowversion incrementado do banco de dados é inserido na coluna rowversion . Essa propriedade torna uma coluna rowversion um candidato fraco para chaves, especialmente chaves primárias. Qualquer atualização feita na linha altera o valor rowversion e, portanto, altera o valor da 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 referência ao valor antigo não serão mais válidas. Se a tabela for referenciada em um cursor dinâmico, todas as atualizações alterarão a posição das linhas no cursor. Se a coluna estiver em uma chave de índice, todas as atualizações da linha de dados também gerarão atualizações do índice. O valor rowversion é incrementado com qualquer instrução update, mesmo que nenhum valor de linha seja alterado. (Por exemplo, se um valor de coluna for 5 e uma instrução update definir o valor como 5, essa ação será considerada uma atualização, mesmo que não haja alteração e a de versão de linha seja incrementada.)

de carimbo de data/hora é o sinônimo do tipo de dados rowversion e está sujeito ao comportamento dos sinônimos de tipo de dados. Em instruções DDL, use rowversion em vez de de carimbo de data/hora sempre que possível. Para obter mais informações, consulte Data Type Synonyms (Transact-SQL).

O Transact-SQL tipo de dados de carimbo de data/hora é diferente do tipo de dados de carimbo de data/hora definido na norma ISO.

Observação

A sintaxe de carimbo de data/hora foi preterida. Esse recurso será removido em uma versão futura do SQL Server. Evite usar esse recurso em novos trabalhos de desenvolvimento e planeje modificar aplicativos que atualmente usam esse recurso.

Em uma instrução CREATE TABLE ou ALTER TABLE, não é necessário especificar um nome de coluna para o timestamp tipo de dados, 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 carimbo de data/hora nome da coluna; No entanto, o sinônimo rowversion não segue esse comportamento. Ao usar versão de linha, você deve especificar um nome de coluna, por exemplo:

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

Observação

Valores de de versão de linha duplicados podem ser gerados usando a instrução SELECT INTO na qual uma coluna rowversion está na lista SELECT. Não recomendamos o uso de rowversion dessa 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 rowversion coluna de uma linha para determinar facilmente se uma instrução update foi executada na linha desde a última vez que foi lida. Se uma instrução update for executada na linha, o valor rowversion será atualizado. Se nenhuma instrução update for executada na linha, o valor rowversion será o mesmo de quando foi lido anteriormente. Para retornar o valor rowversion atual de um banco de dados, use @@DBTS.

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

Por exemplo, suponha que você crie uma tabela chamada MyTest. Você preenche alguns dados na tabela executando as seguintes instruções Transact-SQL.

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 de Transact-SQL de exemplo a seguir para implementar o controle de simultaneidade otimista na tabela MyTest durante a atualização. O script usa <myRv> para representar o valor rowversion da última vez que você leu a linha. Substitua o valor pelo valor real rowversion. Um exemplo de um valor real de rowversion é .

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 a amostra Transact-SQL instruções em uma transação. Ao consultar a variável @t no escopo da transação, você pode recuperar a coluna de myKey atualizada da tabela sem consultar novamente a tabela MyTest.

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

Ver também

TABELA ALTER (Transact-SQL)
CAST e CONVERT (Transact-SQL)
CRIAR TABELA (Transact-SQL)
Tipos de dados (Transact-SQL)
DECLARE @local_variable (Transact-SQL)
DELETE (Transact-SQL)
INSERIR (Transact-SQL)
MIN_ATIVE_ROWVERSION (Transact-SQL)
SET @local_variable (Transact-SQL)
UPDATE (Transact-SQL)