sql >> Databáze >  >> RDS >> Sqlserver

Co je "rowversion" v SQL Server?

V SQL Server, rowversion je datový typ, který zpřístupňuje automaticky generovaná jedinečná binární čísla v rámci databáze. Umožňuje vám označit verze řádků tabulky jedinečnou hodnotou. To pomáhá udržovat integritu databáze, když několik uživatelů aktualizuje řádky současně.

Každá databáze SQL Server má čítač, který se zvyšuje pro každou operaci vložení nebo aktualizace, která se provádí v tabulce, která obsahuje sloupec s rowversion datový typ (nebo jeho časové razítko synonymum, které je označeno pro ukončení podpory).

Pokud tabulka obsahuje rowversion (nebo časové razítko ) při každém vložení nebo aktualizaci řádku hodnotu rowversion sloupec je nastaven na aktuální hodnotu rowversion. To platí, i když je UPDATE nezpůsobí žádné změny v datech.

Příklad 1 – Vytvoření tabulky se sloupcem s verzí řádku

Zde je příklad vytvoření tabulky s rowversion sloupec.

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;

Výsledek:

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)

Podívejte se na hodnoty „Před“ a „Po“ ve výsledcích. Toto představuje aktuální rowversion hodnotu.

V tomto případě jsem vytvořil novou databázi a tabulku a rowversion hodnota začíná na 0x00000000000007D0 . Jakmile jsem vložil řádek, rowversion byl zvýšen na 0x00000000000007D1 .

Příklad 2 – Aktualizace

Jak již bylo zmíněno, rowversion hodnota se také zvýší, když provedete aktualizaci.

Příklad:

SELECT * FROM Pet;

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

SELECT * FROM Pet;

Výsledek:

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

Zde aktualizuji PetName a VersionStamp sloupec (rowversion ) se zvýší na 0x00000000000007D2 .

Příklad 3 – Aktualizace beze změn

Jedna ze skvělých věcí na rowversion je, že se zvýší u všech UPDATE operace i když nedochází k žádné změně .

Pokud například znovu spustím předchozí kód, hodnota VersionStamp sloupec se stále mění, i když k žádné změně nedošlo:

SELECT * FROM Pet;

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

SELECT * FROM Pet;

Výsledek:

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

Hodnota PetId a PetName sloupce se nezměnily, ale VersionStamp sloupec byl zvýšen.

Příklad 4 – Typ dat časového razítka

Časové razítko datový typ je synonymem pro rowversion . Nicméně časové razítko je jedním z datových typů, které byly označeny pro ukončení podpory v budoucí verzi SQL Server. Není překvapením, že společnost Microsoft doporučuje vyhnout se používání této funkce v nových vývojových pracích a plánovat úpravy aplikací, které tuto funkci aktuálně používají.

Pokud tedy narazíte na databázi, která používá časové razítko datový typ, možná budete chtít zvážit jeho změnu na rowversion .

Pouze pro demonstrační účely je zde úprava prvního příkladu pro použití časového razítka místo 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;

Výsledek:

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 když už jsme u toho, zde je další příklad upravený pro časové razítko :

SELECT * FROM Pet;

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

SELECT * FROM Pet;

Výsledek:

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

Možná jste si všimli, že jsem ve skutečnosti nepojmenoval časové razítko sloupec. Pokud nezadáte název sloupce, databázový stroj SQL Server vygeneruje časové razítko název sloupce.

Nicméně rowversion tuto syntaxi nepovoluje, takže při použití rowversion budete muset zadat název sloupce .


  1. Jak zavřít připojení sqlalchemy v MySQL

  2. Vynutit Oracle vrátit TOP N řádků s SKIP LOCKED

  3. ScaleGrid přidává Oracle Cloud pro Managed Database Hosting

  4. MySQL Jak vložíte INSERT DO tabulky s poddotazem SELECT vracejícím více řádků?