Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Какво е „версия на ред“ в SQL Server?

В SQL Server, версия на ред е тип данни, който разкрива автоматично генерирани, уникални двоични числа в база данни. Позволява ви да щамповате с версията редове в таблицата с уникална стойност. Това помага да се поддържа целостта на базата данни, когато няколко потребители актуализират редове едновременно.

Всяка база данни на SQL Server има брояч, който се увеличава за всяка операция вмъкване или актуализиране, която се изпълнява върху таблица, която съдържа колона с версия на ред тип данни (или времево клеймо синоним, който е маркиран за оттегляне).

Ако таблица съдържа версия на ред (или клеймо за време ) колона, всеки път, когато се вмъкне или актуализира ред, стойността на версията на реда колоната е зададена на текущата стойност на версията на реда. Това е вярно, дори когато е UPDATE изявлението не води до промени в данните.

Пример 1 – Създайте таблица с колона с версия на ред

Ето пример за създаване на таблица с версия на ред колона.

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;

Резултат:

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)

Разгледайте стойностите „Преди“ и „След“ в резултатите. Това представлява текущата версия на ред стойност.

В този случай създадох нова база данни и таблица и версията на реда стойността започва от 0x00000000000007D0 . След като вмъкнах ред, версията на реда беше увеличен до 0x00000000000007D1 .

Пример 2 – Актуализации

Както споменахме, версията на ред стойността също се увеличава, когато правите актуализация.

Пример:

SELECT * FROM Pet;

UPDATE Pet
SET PetName = 'Maxine'
WHERE PetId = 1;

SELECT * FROM Pet;

Резултат:

+---------+-----------+--------------------+
| PetId   | PetName   | VersionStamp       |
|---------+-----------+--------------------|
| 1       | Max       | 0x00000000000007D1 |
+---------+-----------+--------------------+
(1 row affected)
(1 row affected)
+---------+-----------+--------------------+
| PetId   | PetName   | VersionStamp       |
|---------+-----------+--------------------|
| 1       | Maxine    | 0x00000000000007D2 |
+---------+-----------+--------------------+
(1 row affected)

Тук актуализирам PetName колона и VersionStamp колона (версия на ред ) се увеличава до 0x00000000000007D2 .

Пример 3 – Актуализации без промени

Едно от страхотните неща за rowversion е, че се увеличава при всички UPDATE операции дори когато не се извършва промяна .

Например, ако изпълня предишния код отново, стойността на VersionStamp колоната все още се променя, въпреки че не е настъпила промяна:

SELECT * FROM Pet;

UPDATE Pet
SET PetName = 'Maxine'
WHERE PetId = 1;

SELECT * FROM Pet;

Резултат:

+---------+-----------+--------------------+
| PetId   | PetName   | VersionStamp       |
|---------+-----------+--------------------|
| 1       | Maxine    | 0x00000000000007D2 |
+---------+-----------+--------------------+
(1 row affected)
(1 row affected)
+---------+-----------+--------------------+
| PetId   | PetName   | VersionStamp       |
|---------+-----------+--------------------|
| 1       | Maxine    | 0x00000000000007D3 |
+---------+-----------+--------------------+
(1 row affected)

Стойността на PetId и PetName колоните не се промениха, но VersionStamp колоната беше увеличена.

Пример 4 – Тип на данните за времевата марка

клеймото за време типът данни е синоним на версия на ред . Въпреки това, марка за време е един от типовете данни, които са маркирани за оттегляне в бъдеща версия на SQL Server. Не е изненадващо, че Microsoft препоръчва да избягвате използването на тази функция в нови разработки и да планирате да модифицирате приложения, които в момента използват тази функция.

Следователно, ако срещнете база данни, която използва timestamp тип данни, може да помислите за промяната му на версия на ред .

Само за демонстрационни цели, ето модификация на първия пример за използване на timestamp вместо версия на ред :

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;

Резултат:

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)

И докато сме на това, ето следващия пример, модифициран за timestamp :

SELECT * FROM Pet;

UPDATE Pet
SET PetName = 'Maxine'
WHERE PetId = 1;

SELECT * FROM Pet;

Резултат:

+---------+-----------+--------------------+
| PetId   | PetName   | timestamp          |
|---------+-----------+--------------------|
| 1       | Max       | 0x00000000000007D1 |
+---------+-----------+--------------------+
(1 row affected)
(1 row affected)
+---------+-----------+--------------------+
| PetId   | PetName   | timestamp          |
|---------+-----------+--------------------|
| 1       | Maxine    | 0x00000000000007D2 |
+---------+-----------+--------------------+
(1 row affected)

Може би сте забелязали, че всъщност не съм предоставил име за timestamp колона. Ако не посочите име на колона, SQL Server Database Engine генерира времево клеймо име на колона.

Въпреки това, rowversion не позволява този синтаксис, така че ще трябва да посочите името на колоната, когато използвате rowversion .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използване на DBCC CLONEDATABASE за генериране на схема и статистически копие само на потребителска база данни в SQL Server 2014 SP2

  2. Как COUNT() работи в SQL Server

  3. Присъединяване на таблица въз основа на стойности, разделени със запетая

  4. Алтернативи на SQL Server Management Studio за разглеждане/редактиране на таблици и изпълнение на заявки

  5. Как работи EXCEPT в SQL Server