No SQL Server, rowversion é um tipo de dados que expõe números binários exclusivos gerados automaticamente em um banco de dados. Ele permite que você marque a versão das linhas da tabela com um valor exclusivo. Isso ajuda a manter a integridade do banco de dados quando vários usuários estão atualizando linhas ao mesmo tempo.
Cada banco de dados SQL Server tem um contador que é incrementado para cada operação de inserção ou atualização executada em uma tabela que contém uma coluna com a versão de linha tipo de dados (ou seu timestamp sinônimo, que é sinalizado para descontinuação).
Se uma tabela contiver uma versão de linha (ou carimbo de data e hora ), sempre que uma linha for inserida ou atualizada, o valor da rowversion coluna é definida para o valor atual de versão de linha. Isso é verdade, mesmo quando um
UPDATE
não resulta em nenhuma alteração nos dados. Exemplo 1 – Criar uma tabela com uma coluna rowversion
Aqui está um exemplo de criação de uma tabela com uma rowversion coluna.
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)
Dê uma olhada nos valores “Antes” e “Depois” nos resultados. Isso representa a versão de linha atual valor.
Neste caso, criei um novo banco de dados e tabela, e a rowversion valor iniciado em
0x00000000000007D0
. Depois de inserir uma linha, a rowversion foi incrementado para 0x00000000000007D1
. Exemplo 2 – Atualizações
Conforme mencionado, a versão de linha valor também é incrementado quando você faz uma atualização.
Exemplo:
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)
Aqui, atualizo o
PetName
coluna e o VersionStamp
coluna (versão de linha ) é incrementado para 0x00000000000007D2
. Exemplo 3 – Atualizações sem alterações
Uma das coisas legais sobre rowversion é que ele é incrementado em todos os
UPDATE
operações mesmo quando nenhuma mudança ocorre . Por exemplo, se eu executar o código anterior novamente, o valor do
VersionStamp
coluna ainda muda, mesmo que nenhuma mudança tenha ocorrido: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)
O valor do
PetId
e PetName
colunas não mudaram, mas o VersionStamp
coluna foi incrementada. Exemplo 4 – O tipo de dados timestamp
O carimbo de data e hora tipo de dados é sinônimo de rowversion . No entanto, carimbo de data e hora é um dos tipos de dados que foram sinalizados para depreciação em uma versão futura do SQL Server. Sem surpresa, a Microsoft recomenda evitar o uso desse recurso em novos trabalhos de desenvolvimento e planejar a modificação de aplicativos que atualmente usam esse recurso.
Portanto, se você encontrar um banco de dados que usa o timestamp tipo de dados, você pode pensar em alterá-lo para rowversion .
Apenas para fins de demonstração, aqui está uma modificação do primeiro exemplo para usar timestamp em vez 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)
E enquanto estamos nisso, aqui está o próximo exemplo 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)
Você deve ter notado que eu não forneci um nome para o timestamp coluna. Se você não especificar um nome de coluna, o SQL Server Database Engine gerará o timestamp nome da coluna.
No entanto, rowversion não permite essa sintaxe, portanto, você precisará especificar o nome da coluna ao usar rowversion .