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;
Zobacz także