В 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 .