Aracılığıyla paylaş


rowversion (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıMicrosoft Fabric'de Azure SQL Yönetilen ÖrneğiSQL veritabanı

Veritabanı içinde otomatik olarak oluşturulan benzersiz ikili sayıları kullanıma sunan bir veri türüdür. rowversion genellikle tablo satırlarını sürüm damgalama mekanizması olarak kullanılır. Depolama boyutu 8 bayttır. rowversion veri türü yalnızca artan bir sayıdır ve tarih veya saati korumaz. Tarih veya saat kaydetmek için datetime2 veri türünü kullanın.

Açıklamalar

Her veritabanının, veritabanındaki bir rowversion sütunu içeren bir tabloda gerçekleştirilen her ekleme veya güncelleştirme işlemi için artımlı bir sayacı vardır. Bu sayaç, veritabanı rowversion'dır. Bu, bir saatle ilişkilendirilebilen gerçek bir saati değil, veritabanındaki göreli zamanı izler. Tabloda yalnızca bir rowversion sütunu olabilir. rowversion sütunu olan bir satır her değiştirildiğinde veya eklendiğinde, artımlı veritabanı rowversion değeri rowversion sütununa eklenir. Bu özellik, rowversion sütununu anahtarlar, özellikle birincil anahtarlar için kötü bir aday yapar. Satırda yapılan tüm güncelleştirmeler rowversion değerini değiştirir ve bu nedenle anahtar değerini değiştirir. Sütun birincil anahtardaysa, eski anahtar değeri artık geçerli değildir ve eski değere başvuran yabancı anahtarlar artık geçerli değildir. Tabloya dinamik bir imleçte başvurulursa, tüm güncelleştirmeler imleçteki satırların konumunu değiştirir. Sütun bir dizin anahtarındaysa, veri satırında yapılan tüm güncelleştirmeler de dizinin güncelleştirmelerini oluşturur. Satır dönüştürme değeri, satır değeri değiştirilmese bile herhangi bir güncelleştirme deyimiyle artırılır. (Örneğin, bir sütun değeri 5 ise ve bir güncelleştirme deyimi değeri 5 olarak ayarlarsa, değişiklik olmasa bile bu eylem bir güncelleştirme olarak kabul edilir ve rowversion artırılır.)

zaman damgası, rowversion veri türünün eş anlamlısıdır ve veri türü eş anlamlılarının davranışına tabidir. DDL deyimlerinde, mümkün olduğunca zaman damgası yerine rowversion kullanın. Daha fazla bilgi için bkz. Veri Türü Eş Anlamlıları (Transact-SQL).

Transact-SQL zaman damgası veri türü, ISO standardında tanımlanan zaman damgası veri türünden farklıdır.

Not

zaman damgası söz dizimi kullanım dışıdır. Bu özellik, SQL Server'ın gelecek bir sürümünde kaldırılacaktır. Bu özelliği yeni geliştirme çalışmalarında kullanmaktan kaçının ve şu anda bu özelliği kullanan uygulamaları değiştirmeyi planlayın.

CREATE TABLE veya ALTER TABLE deyiminde, zaman damgası veri türü için bir sütun adı belirtmeniz gerekmez, örneğin:

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

Sütun adı belirtmezseniz, SQL Server Veritabanı Altyapısı zaman damgasını sütun adını oluşturur; ancak rowversion eş anlamlısı bu davranışı izlemez. rowversion kullandığınızda bir sütun adı belirtmeniz gerekir, örneğin:

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

Not

Yinelenen rowversion değerleri, SELECT listesinde bir rowversion sütununun bulunduğu SELECT INTO deyimi kullanılarak oluşturulabilir. rowversion bu şekilde kullanılmasını önermeyiz.

Geçersiz rowversion sütunu, ikili (8) sütuna eşdeğerdir. Boş değer atanabilir rowversion sütunu, varbinary(8) sütununa benzer.

Bir satırın rowversion sütununu kullanarak bir güncelleştirme deyiminin son okunduktan sonra satıra karşı çalıştırılıp çalıştırılmadığını kolayca belirleyebilirsiniz. Satırda bir update deyimi çalıştırılırsa rowversion değeri güncelleştirilir. Satırda hiçbir güncelleştirme deyimi çalıştırılırsa, rowversion değeri daha önce okunan değerle aynıdır. Veritabanının geçerli rowversion değerini döndürmek için @@DBTSkullanın.

Birden çok kullanıcı satırları aynı anda güncelleştirirken veritabanının bütünlüğünü korumaya yardımcı olmak için tabloya bir rowversion sütunu ekleyebilirsiniz. Tabloyu yeniden sorgulamadan kaç satırın ve hangi satırların güncelleştirilmiş olduğunu da bilmek isteyebilirsiniz.

Örneğin, MyTestadlı bir tablo oluşturduğunuzu varsayalım. Aşağıdaki Transact-SQL deyimlerini çalıştırarak tablodaki bazı verileri doldurursunuz.

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  

Ardından, güncelleştirme sırasında MyTest tablosunda iyimser eşzamanlılık denetimi uygulamak için aşağıdaki örnek Transact-SQL deyimlerini kullanabilirsiniz. Betik, satırı son okuduğunuzdaki rowversion değerini göstermek için <myRv> kullanır. değerini gerçek rowversion değeriyle değiştirin. Gerçek bir rowversion değeri örneği 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;  

Örnek Transact-SQL deyimlerini bir işleme de yerleştirebilirsiniz. İşlem kapsamındaki @t değişkenini sorgulayarak, MyTest tablosunu yeniden sorgulamadan tablonun güncelleştirilmiş myKey sütununu alabilirsiniz.

Aşağıdaki örnekte zaman damgası söz dizimi kullanılır. <myTS> değerini gerçek bir zaman damgasıile değiştirin.

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;  

Ayrıca bkz.

ALTER TABLE (Transact-SQL)
CAST ve CONVERT (Transact-SQL)
CREATE TABLE (Transact-SQL)
Veri Türleri (Transact-SQL)
DECLARE @local_variable (Transact-SQL)
DELETE (Transact-SQL)
INSERT (Transact-SQL)

MIN_ACTIVE_ROWVERSION (Transact-SQL)
SET @local_variable (Transact-SQL)
UPDATE (Transact-SQL)