ROWVERSION (Transact-SQL)

Bir veritabanı içinde otomatik olarak üretilen, benzersiz ikili sayılar gösterir bir veri türüdür.rowversiongenellikle sürümiçin bir mekanizma olarak kullanılır- tablo satırları damgalaması.8 Bayt depolama boyutudur.rowversion Veri türü yalnızca bir sayıdır ve bir tarih veya saatkorumaz.Bir tarih veya saatkaydetmek için kullandığınız bir datetime2 veri türü.

Açıklamalar

Her veritabanı için her INSERT artırılır sayaç veya içeren bir tablo üzerinde gerçekleştirilen güncelleştirme işlemi olan bir rowversion sütun içinde veritabanı.Bu veritabanı rowversion sayacıdır.Bu, bir veritabanı, bir saat ile ilişkili olabilir değil bir gerçek saat içinde göreli saat izler.Bir tablo yalnızca bir kez olabilir rowversion sütun.Her saat , bir satır ile bir rowversion sütun değiştirilmiş veya eklenen, artan veritabanı rowversion değeri eklenir rowversion sütun.Bu özellik sağlar bir rowversion sütun zayıf bir adayın anahtarları, özellikle birincil anahtarlar.Satırda yaptığınız herhangi bir güncelleştirmeyi rowversion değerini değiştirir ve bu nedenle, anahtar değerini değiştirir.' % S'sütun sütun bir birincil anahtarise, eski anahtar değeri artık geçerli değil ve eski değerine başvuran yabancı anahtarları artık geçerli değil.tablo içinde dinamik bir imleçbaşvuruyorsa, tüm güncelleştirmeler imleçsatır konumunu değiştirir.sütun içinde bir dizin anahtarise, veri satırı için tüm güncelleştirmeleri dizin güncelleştirmeleri de oluşturur.

timestampeşanlamlıdır rowversion veri yazın ve veri davranışını tabi türü eşanlamlı.DDL deyimleri kullanmak rowversion yerine timestamp her yerde mümkün.Daha fazla bilgi için, bkz. Veri türü Eşanlamlılar (Transact-SQL).

Transact-SQL timestamp Veri türü olan farklı timestamp veri türü tanımlanan ISO standardı.

Not

timestamp Sözdizimi itiraz.Bu özellik Microsoft SQL Server'ın ilerideki bir sürümünde kaldırılacaktır. Yeni geliştirme işlerinde bu özelliği kullanmaktan kaçının ve bu özelliği kullanmakta olan uygulamalarda değişiklik yapmayı planlayın.

create table veya alter table deyim, sütun adını belirtmeniz gerekmez timestamp veri türü, örneğin:

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

Bir sütun adı belirtmezseniz, SQL Server Veritabanı Altyapısı oluşturduğu timestamp sütun adı; Ancak, rowversion eş değil izleyin bu davranışı.Kullandığınızda rowversion, örneğin bir sütun adı belirtmeniz gerekir:

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

Not

Yinelenen rowversion değerleri, select INTO deyim kullanarak oluşturulabilir bir rowversionsütun Kullanma önerilmez rowversion Bu şekilde.

Bir nonnullable rowversion sütun gönderilmesinin eşdeğer bir binary(8) sütun.Null olabilecek bir rowversion sütun gönderilmesinin eşdeğer bir varbinary(8) sütun.

Kullanabileceğiniz kolayca herhangi bir değer satırda son saat sonra onu değişip değişmediğini belirlemek için bir satır,sütunrowversionokunduğu. Satır için herhangi bir değişiklik yaptıysanız, rowversion değeri güncelleştirilir.Satır için hiçbir değişiklik yapılırsa, rowversion ne zaman önceden okunduktan aynı değerdir.Veritabanı için geçerli rowversion değeri döndürmek için kullanın @@ dbts.

Ekleyebileceğiniz bir rowversionsütun birden çok kullanıcı aynı saatSatırları güncellerken veritabanının bütünlük sağlamak için bir tablo . Satırların sayısını ve hangi tabloyeniden olmadan güncellendiðini bilmek isteyebilirsiniz.

Örneğin, adlı bir tablo oluşturmak varsayalım MyTest.Aşağıdakini çalıştırarak bazı veriler tablo doldurmak Transact-SQL ifadeleri.

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

Aşağıdaki örnek daha sonra kullanabilirsiniz Transact-SQL , iyimser eşzamanlılık denetimi gerçekleştirmek için ifadeleri MyTest tablo sırasında güncelleştirme.

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

myValueİş rowversion sütun değeri satır satır okumak son saat gösterir.Bu değer gerçek tarafından değiştirilmesi gereken rowversion değer.Gerçek bir örnek rowversion 0x00000000000007D3 değerdir.

Örnek de koyabilirsiniz Transact-SQL deyimler hareket.Sorgulamak @t hareket kapsam içinde değişken getirebileceðiniz güncelleştirilmiş myKey sütun tablo yeniden sorgulayarak olmadan MyTest tablo.

Aşağıda aynı örnek, kullanarak timestamp sözdizimi:

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 = myValue;
IF (SELECT COUNT(*) FROM @t) = 0
    BEGIN
        RAISERROR ('error changing row with myKey = %d'
            ,16 -- Severity.
            ,1 -- State 
            ,1) -- myKey that was changed 
    END;