Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Co to jest „rowversion” w SQL Server?

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 .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie SQL — łączenie wyników w jeden ciąg

  2. Idealna burza do uaktualnienia do nowoczesnej wersji SQL Server

  3. Jak utworzyć ograniczenie sprawdzania wielu tabel?

  4. Dlaczego zapytanie parametryczne generuje znacznie wolniejszy plan zapytań w porównaniu z zapytaniem niesparametryzowanym?

  5. Funkcja bezpieczeństwa Spotlight Cloud — usuń literały