Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Apa itu "rowversion" di SQL Server?

Di SQL Server, rowversion adalah tipe data yang memperlihatkan bilangan biner unik yang dihasilkan secara otomatis dalam database. Ini memungkinkan Anda untuk mencap baris tabel versi dengan nilai unik. Ini membantu menjaga integritas database saat banyak pengguna memperbarui baris secara bersamaan.

Setiap database SQL Server memiliki penghitung yang bertambah untuk setiap operasi penyisipan atau pembaruan yang dilakukan pada tabel yang berisi kolom dengan versi baris tipe data (atau stempel waktu sinonim, yang ditandai untuk dihentikan).

Jika tabel berisi rowversion (atau stempel waktu ) kolom, setiap kali baris dimasukkan atau diperbarui, nilai versi baris kolom diatur ke nilai versi baris saat ini. Ini benar, bahkan ketika UPDATE pernyataan tidak menghasilkan perubahan apa pun pada data.

Contoh 1 – Membuat Tabel dengan Kolom rowversion

Berikut ini contoh membuat tabel dengan rowversion kolom.

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;

Hasil:

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)

Lihatlah nilai "Sebelum" dan "Setelah" dalam hasil. Ini mewakili rowversion current saat ini nilai.

Dalam hal ini saya membuat database dan tabel baru, dan rowversion nilai dimulai pada 0x00000000000007D0 . Setelah saya menyisipkan baris, versi baris telah ditambahkan ke 0x00000000000007D1 .

Contoh 2 – Pembaruan

Seperti disebutkan, rowversion nilai juga bertambah saat Anda melakukan pembaruan.

Contoh:

SELECT * FROM Pet;

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

SELECT * FROM Pet;

Hasil:

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

Di sini, saya memperbarui PetName kolom, dan VersionStamp kolom (versi baris ) bertambah menjadi 0x00000000000007D2 .

Contoh 3 – Pembaruan Tanpa Perubahan

Salah satu hal keren tentang rowversion apakah itu bertambah pada semua UPDATE operasi bahkan ketika tidak ada perubahan yang terjadi .

Misalnya, jika saya menjalankan kembali kode sebelumnya, nilai VersionStamp kolom tetap berubah, meskipun tidak ada perubahan:

SELECT * FROM Pet;

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

SELECT * FROM Pet;

Hasil:

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

Nilai PetId dan PetName kolom tidak berubah, tetapi VersionStamp kolom bertambah.

Contoh 4 – Tipe Data stempel waktu

Stempel waktu tipe data adalah sinonim untuk rowversion . Namun, stempel waktu adalah salah satu tipe data yang telah ditandai untuk dihentikan di versi SQL Server yang akan datang. Tidak mengherankan, Microsoft menyarankan untuk menghindari penggunaan fitur ini dalam pekerjaan pengembangan baru, dan berencana untuk memodifikasi aplikasi yang saat ini menggunakan fitur ini.

Oleh karena itu, jika Anda menemukan database yang menggunakan stempel waktu tipe data, Anda mungkin ingin mempertimbangkan untuk mengubahnya menjadi rowversion .

Hanya untuk tujuan demonstrasi, berikut adalah modifikasi dari contoh pertama menggunakan stempel waktu bukannya 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;

Hasil:

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)

Dan sementara kami melakukannya, inilah contoh berikutnya yang dimodifikasi untuk stempel waktu :

SELECT * FROM Pet;

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

SELECT * FROM Pet;

Hasil:

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

Anda mungkin memperhatikan bahwa saya sebenarnya tidak memberikan nama untuk stempel waktu kolom. Jika Anda tidak menentukan nama kolom, SQL Server Database Engine akan menghasilkan stempel waktu nama kolom.

Namun, versi baris tidak mengizinkan sintaks ini, jadi Anda harus menentukan nama kolom saat menggunakan 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. Apakah mungkin menggunakan Pencarian Teks Lengkap (FTS) dengan LINQ?

  2. Bagaimana NTILE() Bekerja di SQL Server

  3. SSMS versi 18 – tanpa Diagram Basis Data

  4. cara terbaik untuk mengonversi dan memvalidasi string tanggal

  5. Bagaimana saya bisa menampilkan struktur tabel dalam kueri SQL Server?