rowversion (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Adalah jenis data yang mengekspos angka biner unik yang dihasilkan secara otomatis dalam database. rowversion umumnya digunakan sebagai mekanisme untuk baris tabel stempel versi. Ukuran penyimpanannya adalah 8 byte. Jenis data rowversion hanyalah angka bertahap dan tidak mempertahankan tanggal atau waktu. Untuk merekam tanggal atau waktu, gunakan jenis data datetime2 .

Keterangan

Setiap database memiliki penghitung yang bertahap untuk setiap operasi penyisipan atau pembaruan yang dilakukan pada tabel yang berisi kolom rowversion dalam database. Penghitung ini adalah rowversion database. Ini melacak waktu relatif dalam database, bukan waktu aktual yang dapat dikaitkan dengan jam. Tabel hanya dapat memiliki satu kolom rowversion . Setiap kali baris dengan kolom rowversion dimodifikasi atau disisipkan, nilai rowversion database bertahap disisipkan di kolom rowversion . Properti ini membuat kolom rowversion menjadi kandidat yang buruk untuk kunci, terutama kunci primer. Pembaruan apa pun yang dibuat pada baris mengubah nilai rowversion dan, oleh karena itu, mengubah nilai kunci. Jika kolom berada dalam kunci primer, nilai kunci lama tidak lagi valid, dan kunci asing yang mereferensikan nilai lama tidak lagi valid. Jika tabel dirujuk dalam kursor dinamis, semua pembaruan mengubah posisi baris dalam kursor. Jika kolom berada dalam kunci indeks, semua pembaruan pada baris data juga menghasilkan pembaruan indeks. Nilai rowversion bertambah dengan pernyataan pembaruan apa pun, meskipun tidak ada nilai baris yang diubah. (Misalnya, jika nilai kolom adalah 5, dan pernyataan pembaruan menetapkan nilai ke 5, tindakan ini dianggap sebagai pembaruan meskipun tidak ada perubahan, dan rowversion bertahap.)

tanda waktu adalah sinonim untuk jenis data rowversion dan tunduk pada perilaku sinonim jenis data. Dalam pernyataan DDL, gunakan rowversion alih-alih tanda waktu sedapat mungkin. Untuk informasi selengkapnya, lihat Sinonim Tipe Data (Transact-SQL).

Jenis data tanda waktu Transact-SQL berbeda dari jenis data tanda waktu yang ditentukan dalam standar ISO.

Catatan

Sintaks tanda waktu tidak digunakan lagi. Fitur ini akan dihapus dalam versi SQL Server yang akan datang. Hindari menggunakan fitur ini dalam pekerjaan pengembangan baru, dan rencanakan untuk memodifikasi aplikasi yang saat ini menggunakan fitur ini.

Dalam pernyataan CREATE TABLE atau ALTER TABLE, Anda tidak perlu menentukan nama kolom untuk jenis data tanda waktu, misalnya:

CREATE TABLE ExampleTable (PriKey int PRIMARY KEY, timestamp);  

Jika Anda tidak menentukan nama kolom, Mesin Database SQL Server menghasilkan nama kolom tanda waktu; namun, sinonim rowversion tidak mengikuti perilaku ini. Saat menggunakan rowversion, Anda harus menentukan nama kolom, misalnya:

CREATE TABLE ExampleTable2 (PriKey int PRIMARY KEY, VerCol rowversion) ;  

Catatan

Nilai rowversion duplikat dapat dihasilkan dengan menggunakan pernyataan SELECT INTO tempat kolom rowversion berada dalam daftar SELECT. Kami tidak merekomendasikan penggunaan rowversion dengan cara ini.

Kolom rowversion yang tidak dapat diurungkan secara semantik setara dengan kolom biner(8). Kolom rowversion nullable secara semantik setara dengan kolom varbinary(8).

Anda dapat menggunakan kolom rowversion baris untuk dengan mudah menentukan apakah pernyataan pembaruan telah dijalankan terhadap baris sejak terakhir kali dibaca. Jika pernyataan pembaruan dijalankan terhadap baris, nilai rowversion diperbarui. Jika tidak ada pernyataan pembaruan yang dijalankan terhadap baris, nilai rowversion sama seperti saat sebelumnya dibaca. Untuk mengembalikan nilai rowversion saat ini untuk database, gunakan @@DBTS.

Anda bisa menambahkan kolom rowversion ke tabel untuk membantu mempertahankan integritas database saat beberapa pengguna memperbarui baris secara bersamaan. Anda mungkin juga ingin mengetahui berapa banyak baris dan baris mana yang diperbarui tanpa mengkueri ulang tabel.

Misalnya, asumsikan bahwa Anda membuat tabel bernama MyTest. Anda mengisi beberapa data dalam tabel dengan menjalankan pernyataan Transact-SQL berikut.

CREATE TABLE MyTest (myKey int PRIMARY KEY  
    ,myValue int, RV rowversion);  
GO   
INSERT INTO MyTest (myKey, myValue) VALUES (1, 0);  
GO   
INSERT INTO MyTest (myKey, myValue) VALUES (2, 0);  
GO  

Anda kemudian dapat menggunakan contoh pernyataan Transact-SQL berikut untuk menerapkan kontrol konkurensi optimis pada MyTest tabel selama pembaruan. Skrip menggunakan <myRv> untuk mewakili nilai rowversion dari terakhir kali Anda membaca baris. Ganti nilai dengan nilai rowversion aktual. Contoh nilai rowversion aktual adalah 0x00000000000007D3.

DECLARE @t TABLE (myKey int);  
UPDATE MyTest  
SET myValue = 2  
    OUTPUT inserted.myKey INTO @t(myKey)   
WHERE myKey = 1   
    AND RV = <myRv>;  
IF (SELECT COUNT(*) FROM @t) = 0  
    BEGIN  
        RAISERROR ('error changing row with myKey = %d'  
            ,16 -- Severity.  
            ,1 -- State   
            ,1) -- myKey that was changed   
    END;  

Anda juga dapat memasukkan contoh pernyataan Transact-SQL ke dalam transaksi. Dengan mengkueri @t variabel dalam cakupan transaksi, Anda dapat mengambil kolom tabel yang diperbarui myKey tanpa mengkueri MyTest ulang tabel.

Berikut ini adalah contoh yang sama menggunakan sintaks tanda waktu. Ganti <myTS> dengan tanda waktu aktual.

CREATE TABLE MyTest2 (myKey int PRIMARY KEY  
    ,myValue int, TS timestamp);  
GO   
INSERT INTO MyTest2 (myKey, myValue) VALUES (1, 0);  
GO   
INSERT INTO MyTest2 (myKey, myValue) VALUES (2, 0);  
GO  
DECLARE @t TABLE (myKey int);  
UPDATE MyTest2  
SET myValue = 2  
    OUTPUT inserted.myKey INTO @t(myKey)   
WHERE myKey = 1   
    AND TS = <myTS>;  
IF (SELECT COUNT(*) FROM @t) = 0  
    BEGIN  
        RAISERROR ('error changing row with myKey = %d'  
            ,16 -- Severity.  
            ,1 -- State   
            ,1) -- myKey that was changed   
    END;  

Lihat juga

ALTER TABLE (Transact-SQL)
CAST dan CONVERT (Transact-SQL)
BUAT TABEL (Transact-SQL)
Tipe Data (Transact-SQL)
DECLARE @local_variable (Transact-SQL)
DELETE (Transact-SQL)
INSERT (Transact-SQL)
MIN_ACTIVE_ROWVERSION (T-SQL)
SET @local_variable (Transact-SQL)
UPDATE (Transact-SQL)