W SQL Server rowversion to typ danych, który ujawnia automatycznie generowane, unikalne liczby binarne w bazie danych. Pozwala na oznaczanie wersji wierszy tabeli unikalną wartością. Pomaga to zachować integralność bazy danych, gdy wielu użytkowników aktualizuje wiersze w tym samym czasie.
Każda baza danych SQL Server ma licznik, który jest zwiększany dla każdej operacji wstawiania lub aktualizacji wykonywanej w tabeli zawierającej kolumnę z rowversion typ danych (lub jego sygnatura czasowa synonim, który jest oznaczony jako wycofany).
Jeśli tabela zawiera rowversion (lub sygnatura czasowa ), za każdym razem, gdy wiersz jest wstawiany lub aktualizowany, wartość rowversion kolumna jest ustawiona na bieżącą wartość rowversion. To prawda, nawet jeśli UPDATE
oświadczenie nie powoduje żadnych zmian w danych.
Przykład 1 – Utwórz tabelę z kolumną rowversion
Oto przykład tworzenia tabeli z wersją wiersza kolumna.
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;
Wynik:
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)
Spójrz na wartości „Przed” i „Po” w wynikach. To reprezentuje aktualną wersję wiersza wartość.
W tym przypadku utworzyłem nową bazę danych i tabelę oraz rowversion wartość zaczyna się od 0x00000000000007D0
. Po wstawieniu wiersza rowversion został zwiększony do 0x00000000000007D1
.
Przykład 2 – Aktualizacje
Jak wspomniano, rowwersja wartość jest również zwiększana podczas aktualizacji.
Przykład:
SELECT * FROM Pet; UPDATE Pet SET PetName = 'Maxine' WHERE PetId = 1; SELECT * FROM Pet;
Wynik:
+---------+-----------+--------------------+ | PetId | PetName | VersionStamp | |---------+-----------+--------------------| | 1 | Max | 0x00000000000007D1 | +---------+-----------+--------------------+ (1 row affected) (1 row affected) +---------+-----------+--------------------+ | PetId | PetName | VersionStamp | |---------+-----------+--------------------| | 1 | Maxine | 0x00000000000007D2 | +---------+-----------+--------------------+ (1 row affected)
Tutaj aktualizuję PetName
kolumna i VersionStamp
kolumna (wersja wiersza ) jest zwiększany do 0x00000000000007D2
.
Przykład 3 – aktualizacje bez zmian
Jedna z fajnych rzeczy związanych z rowversion jest to, że jest zwiększany przy wszystkich UPDATE
operacje nawet jeśli nie ma żadnych zmian .
Na przykład, jeśli ponownie uruchomię poprzedni kod, wartość VersionStamp
kolumna nadal się zmienia, mimo że nie nastąpiła żadna zmiana:
SELECT * FROM Pet; UPDATE Pet SET PetName = 'Maxine' WHERE PetId = 1; SELECT * FROM Pet;
Wynik:
+---------+-----------+--------------------+ | PetId | PetName | VersionStamp | |---------+-----------+--------------------| | 1 | Maxine | 0x00000000000007D2 | +---------+-----------+--------------------+ (1 row affected) (1 row affected) +---------+-----------+--------------------+ | PetId | PetName | VersionStamp | |---------+-----------+--------------------| | 1 | Maxine | 0x00000000000007D3 | +---------+-----------+--------------------+ (1 row affected)
Wartość PetId
i PetName
kolumny się nie zmieniły, ale VersionStamp
kolumna została zwiększona.
Przykład 4 – Typ danych znacznika czasu
sygnatura czasowa typ danych jest synonimem rowversion . Jednak sygnatura czasowa to jeden z typów danych, które zostały oznaczone do wycofania w przyszłej wersji programu SQL Server. Nic dziwnego, że Microsoft zaleca unikanie używania tej funkcji w nowych pracach programistycznych i planowanie modyfikacji aplikacji, które obecnie korzystają z tej funkcji.
Dlatego jeśli napotkasz bazę danych, która używa sygnatury czasowej typ danych, warto pomyśleć o zmianie go na rowversion .
Tylko w celach demonstracyjnych, oto modyfikacja pierwszego przykładu wykorzystująca sygnaturę czasową zamiast 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;
Wynik:
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)
A skoro już przy tym jesteśmy, oto następny przykład zmodyfikowany pod kątem sygnatury czasowej :
SELECT * FROM Pet; UPDATE Pet SET PetName = 'Maxine' WHERE PetId = 1; SELECT * FROM Pet;
Wynik:
+---------+-----------+--------------------+ | PetId | PetName | timestamp | |---------+-----------+--------------------| | 1 | Max | 0x00000000000007D1 | +---------+-----------+--------------------+ (1 row affected) (1 row affected) +---------+-----------+--------------------+ | PetId | PetName | timestamp | |---------+-----------+--------------------| | 1 | Maxine | 0x00000000000007D2 | +---------+-----------+--------------------+ (1 row affected)
Być może zauważyłeś, że tak naprawdę nie podałem nazwy dla sygnatury czasowej kolumna. Jeśli nie określisz nazwy kolumny, aparat bazy danych SQL Server wygeneruje sygnaturę czasową nazwa kolumny.
Jednak rowversion nie zezwala na tę składnię, więc musisz określić nazwę kolumny podczas korzystania z rowversion .