Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

O que é “rowversion” no SQL Server?


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 .