ROWVERSION (Transact-sql)

Bir veritabanı içinde otomatik olarak üretilen, benzersiz ikili sayılar ortaya çıkarır bir veri türüdür. rowversiongenellikle sürüm damgası tablo satırları için bir mekanizma olarak kullanılır. Depolama boyutu 8 bayttır. rowversionVeri türü yalnızca bir artan sayı ve Tarih veya saat korumaz. Tarihi veya saati kaydetmek için kullanmak bir datetime2veri türü.

Açıklamalar

Her ekleme için artırılır sayaç veya güncelleştirme işlemi içeren bir tablo üzerinde gerçekleştirilen her veritabanı olan bir rowversionveritabanı içindeki sütun. Bu sayaç, veritabanı rowversion olduğunu. Bu göreceli bir süre değil bir gerçek zaman saati ile ilişkili olabilir bir veritabanı içinde izler. Bir tabloda yalnızca bir olabilir rowversionsütun. Her zaman, bir satır ile bir rowversionsütun değiştirilmiş veya eklenmiş, artan veritabanı rowversion değeri eklenir rowversionsütun. Bu özellik geçici bir rowversionsütun tuşları, özellikle birincil anahtar için kötü aday. Satır yaptığınız güncelleştirmeler rowversion değerini değiştirir ve bu nedenle, anahtar değerini değiştirir. Sütun bir birincil anahtar ise, eski anahtar değeri artık geçerli değil ve eski değerine başvuran yabancı anahtar artık geçerli değil. Dinamik bir imleç tablo başvurulan tüm güncelleştirmeleri imleci satır konumunu değiştirin. Bir dizin anahtar sütunu ise, tüm güncelleştirmeler, veri satırı da güncelleştirmeleri dizin oluşturur.

timestampeşanlamlı olduğunu rowversionverileri yazın ve veri tabi türü eşanlamlılar davranıştır. ddl deyimleri kullanmak rowversionyerine timestampmümkün olan her yerde. Daha fazla bilgi için, bkz. Veri türü eşanlamlılar (Transact-sql).

Transact-SQL  timestampVeri türü farklı timestampISO standart tanımlı veri türü.

[!NOT]

timestampSözdizimi önerilmiyor. 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 deyimi içinde sütun adını belirtmeniz gerekmez timestampveri türü, örneğin:

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

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

Bir sütun adı belirtmezseniz, SQL Server Veritabanı Altyapısıüreten timestampsütun adı; Ancak, rowversioneşanlamlı 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) ;

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

[!NOT]

Yinelenen rowversiondeğerleri olan select INTO deyimi kullanılarak oluşturulabilir bir rowversionsütundur seçme listesinde. Kullanmanızı öneririz değil rowversionBu şekilde.

Bir nonnullable rowversionsütun anlam eşdeğer bir binary(8)sütun. Bir NULL rowversionsütun anlam eşdeğer bir varbinary(8)sütun.

Sen-ebilmek kullanma rowversionkolayca beri son satırda herhangi bir değer değişip değişmediğini belirlemek için bir satırın sütun okumak. Rowversion değer, satır herhangi bir değişiklik yaptıysanız, güncelleştirilir. Satır herhangi bir değişiklik yaptıysanız, rowversion önceden okunduğunda aynı değerdir. Veritabanı için geçerli rowversion değeri döndürmek için kullanın @ dbts.

Sen-ebilmek eklemek a rowversionsütun için birden çok kullanıcı aynı anda Satırları güncellerken veritabanı bütünlüğünü korumak için bir tablo. Kaç satır ve tablo yeniden olmadan hangi satır güncelleştirildi bilmek isteyebilirsiniz.

Örneğin, adlı bir tablo oluşturmak varsayalım MyTest. Tablodaki bazı veriler aşağıdaki çalıştırarak doldurmak Transact-SQLdeyimleri.

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

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 sonra kullanabileceğiniz Transact-SQLiyimser eşzamanlılık denetimi uygulamak için ifadeleri MyTestTablo güncelleştirme sırasında.

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;

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;

myValueise rowversionsütun değeri son satırı okuması gösteren satırın. Bu değer gerçek tarafından değiştirilmesi gereken rowversiondeğer. Gerçek bir örnek rowversiondeğerdir 0x00000000000007D3.

Sen-ebilmek koymak da örnek Transact-SQLdeyimleri bir işlem. Sorgulayarak @tdeğişken hareketi kapsamında, güncelleştirilmiş almak myKeyrequerying olmadan tablo sütun MyTest tablosu.

Aşağıda aynı örnek vardır kullanarak timestampsö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;

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;

Ayrıca bkz.

Başvuru

ALTER TABLE (Transact-SQL)

CAST ve CONVERT (Transact-SQL)

Tablo (Transact-sql) oluştur

Veri Türleri (Transact-SQL)

DECLARE @local\_variable (Transact-SQL)

Sil (Transact-sql)

Insert (Transact-sql)

MIN_ACTIVE_ROWVERSION (Transact-sql)

set @ local_variable (Transact-sql)

Güncelleştirme (Transact-sql)