ROWVERSION (języka Transact-SQL)

Jest to typ danych, który udostępnia automatycznie wygenerowany unikatowy liczb dwójkowych w bazie danych.rowversionzwykle jest używana jako mechanizm wersja-stemplowanie wierszy tabela .Rozmiar magazynu jest 8 bajtów.rowversion Typ danych jest numerem kolejnym i nie zachowuje data lub czas.Aby zarejestrować data lub czas, należy użyć datetime2 typu danych.

Uwagi

Każda baza danych ma licznika, który jest zwiększany o jeden dla każdego Wstaw lub operacji aktualizacji, która jest wykonywana w tabela , która zawiera rowversion kolumna w bazie danych.Ten licznik jest rowversion bazy danych.Śledzi względnego czas w bazie danych, nie rzeczywisty czas może być skojarzona z zegarem.tabela może mieć tylko jeden rowversionkolumna. Za każdym czas , wiersz z rowversion kolumna jest modyfikowane lub wstawione, wartość rowversion zwiększoną bazy danych zostanie wstawiony w rowversion kolumna.Ta właściwość sprawia, że rowversion kolumna słaby kandydat kluczy, szczególnie podstawowych kluczy.Aktualizacje w wierszu zmienia wartość rowversion i dlatego zmienia wartość klucz .Jeśli kolumna kluczpodstawowego, stara wartość klucz nie jest już prawidłowy i odwoływania się do starej wartości kluczy obcych są już nieważne.Jeśli tabela jest wywoływany w dynamicznych kursor, wszystkie aktualizacje zmienić położenie wierszy w kursor.Jeśli kolumna jest w indeksie klucz, wszystkie aktualizacje do wiersza danych również generować aktualizacji indeksu.

timestampjest synonimem dla rowversion Typ danych i podlega zachowanie danych typu synonimy.W instrukcji DDL za pomocą rowversion zamiast timestamp tam, gdzie jest to możliwe.Aby uzyskać więcej informacji, zobacz Synonimami typu danych (Transact-SQL).

Transact-SQL timestamp Typ danych różni się od timestamp Typ danych zdefiniowany w standardzie ISO.

Ostrzeżenie

timestamp Składnia jest niezalecane.Ta funkcja zostanie usunięta z przyszłej wersji programu Microsoft SQL Server. Należy unikać stosowania tej funkcji w nowych projektach oraz zaplanować modyfikację aplikacji, w których obecnie jest używana ta funkcja.

W instrukcji ALTER TABLE lub CREATE TABLE instrukcja, nie trzeba określić nazwę kolumna dla timestamp Typ danych, na przykład:

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

Jeśli nie określisz nazwę kolumna , Aparat baz danych programu SQL Server generuje timestampnazwękolumna ; Jednakże rowversion synonim nieprzestrzegania zachowanie.Podczas korzystania z rowversion, należy określić nazwę kolumna , na przykład:

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

Ostrzeżenie

Duplikowanie rowversion wartości mogą być generowane przy użyciu SELECT INTO instrukcja , w którym rowversion kolumna jest na liście SELECT.Nie zaleca się korzystanie z rowversion w ten sposób.

Nonnullable rowversion kolumna jest semantycznie równoważne binary(8) kolumna.Nullable rowversion kolumna jest semantycznie równoważne varbinary(8) kolumna.

Można użyć rowversion kolumna wiersza łatwo określić, czy każda wartość w wierszu zostało wcześniej zmienione od czas ostatniego odczytu.W przypadku wprowadzenia jakichkolwiek zmian w wierszu wartość rowversion jest aktualizowana.Jeśli wiersz jest wprowadzane żadne zmiany, wartość rowversion jest taka sama, jak gdy wcześniej została przeczytana.Aby przywrócić bieżącą wartość rowversion bazy danych, należy użyć @@ dbts.

Można dodać rowversion kolumna do tabela , aby zachować integralność bazy danych podczas aktualizowania wierszy w tym samym czaswielu użytkowników.Można również wiedzieć, ile wierszy i wierszy, które zostały zaktualizowane bez podczas ponownej kwerendy tabela.

Załóżmy na przykład, utworzyć tabela o nazwie MyTest.Wypełniać niektóre dane w tabela , uruchamiając następujące Transact-SQL instrukcji.

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

Następnie można użyć następujących przykładowych Transact-SQL instrukcji implementować kontrolę optymistycznej współbieżność na MyTest tabela podczas aktualizacji.

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;

myValuejest rowversionwartośćkolumna wiersza, który wskazuje ostatni czas odczytu wiersza. Wartość tę należy zastąpić rzeczywistą rowversion wartości.Przykład rzeczywistych rowversion wartość jest 0x00000000000007D3.

Można również umieścić próbkę Transact-SQL instrukcji do transakcji.Przez badanie @t zmiennych w zakres transakcji, można pobrać zaktualizowane myKey kolumna tabela bez ponowne wykonanie kwerendy MyTest tabela.

Oto przykład tej samej za pomocą timestamp składni:

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;