Udostępnij za pośrednictwem


rowversion (Transact-SQL)

Dotyczy:sql ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL Database w usłudze Microsoft Fabric

To typ danych, który uwidacznia automatycznie generowane, unikatowe liczby binarne w bazie danych. rowversion jest zwykle używany jako mechanizm dla wierszy tabeli sygnatur wersji. Rozmiar magazynu wynosi 8 bajtów. Typ danych rowversion jest tylko liczbą przyrostową i nie zachowuje daty ani godziny. Aby zarejestrować datę lub godzinę, użyj typu danych data/godzina2.

Uwagi

Każda baza danych ma licznik, który jest zwiększany dla każdej operacji wstawiania lub aktualizacji wykonywanej w tabeli zawierającej rowversion kolumny w bazie danych. Ten licznik jest rowversion bazy danych. Śledzi to względny czas w bazie danych, a nie rzeczywisty czas, który może być skojarzony z zegarem. Tabela może zawierać tylko jedną kolumnę rowversion. Za każdym razem, gdy wiersz z rowversion kolumny jest modyfikowany lub wstawiany, przyrostowa wartość rowversion bazy danych jest wstawiana w kolumnie rowversion. Ta właściwość sprawia, że rowversion kolumnie słabego kandydata do kluczy, zwłaszcza kluczy podstawowych. Każda aktualizacja w wierszu zmienia wartość rowversion i dlatego zmienia wartość klucza. Jeśli kolumna znajduje się w kluczu podstawowym, stara wartość klucza nie jest już prawidłowa, a klucze obce odwołujące się do starej wartości nie są już prawidłowe. Jeśli tabela jest przywoływana w kursorze dynamicznym, wszystkie aktualizacje zmieniają położenie wierszy w kursorze. Jeśli kolumna znajduje się w kluczu indeksu, wszystkie aktualizacje wiersza danych również generują aktualizacje indeksu. Wartość rowversion jest zwiększana przy użyciu dowolnej instrukcji aktualizacji, nawet jeśli żadne wartości wierszy nie zostaną zmienione. (Jeśli na przykład wartość kolumny to 5, a instrukcja update ustawia wartość na 5, ta akcja jest uznawana za aktualizację, mimo że nie ma żadnych zmian, a rowversion jest zwiększana).

znacznik czasu jest synonimem typu danych rowversion i podlega zachowaniu synonimów typu danych. W instrukcjach DDL użyj rowversion zamiast znacznika czasu wszędzie tam, gdzie to możliwe. Aby uzyskać więcej informacji, zobacz Synonimy typu danych (Transact-SQL).

Transact-SQL typ danych sygnatury czasowej różni się od sygnatury czasowej typu danych zdefiniowanego w standardzie ISO.

Nuta

Znacznik czasu składni jest przestarzały. Ta funkcja zostanie usunięta w przyszłej wersji programu SQL Server. Unikaj używania tej funkcji w nowych pracach programistycznych i zaplanuj modyfikowanie aplikacji, które obecnie korzystają z tej funkcji.

W instrukcji CREATE TABLE lub ALTER TABLE nie trzeba określać nazwy kolumny dla znacznika czasu typ danych, na przykład:

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

Jeśli nie określisz nazwy kolumny, aparat bazy danych programu SQL Server generuje znacznik czasu nazwa kolumny; jednak synonim rowversion nie jest zgodne z tym zachowaniem. W przypadku używania rowversionnależy określić nazwę kolumny, na przykład:

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

Nuta

Zduplikowane wartości rowversion można wygenerować przy użyciu instrukcji SELECT INTO, w której na liście SELECT znajduje się kolumna rowversion. W ten sposób nie zalecamy używania rowversion.

Kolumna jest semantycznie równoważna kolumnie binarnej (8). Kolumna dopuszczająca wartość null jest semantycznie równoważna kolumnie varbinary(8).

Możesz użyć rowversion kolumny wiersza, aby łatwo określić, czy instrukcja aktualizacji została uruchomiona względem wiersza od czasu ostatniego odczytania. Jeśli instrukcja update jest uruchamiana względem wiersza, wartość rowversion zostanie zaktualizowana. Jeśli w wierszu nie są uruchamiane żadne instrukcje aktualizacji, wartość rowversion jest taka sama jak w przypadku poprzedniego odczytu. Aby zwrócić bieżącą wartość rowversion bazy danych, użyj @@DBTS.

Do tabeli można dodać kolumnę rowversion , aby ułatwić zachowanie integralności bazy danych, gdy wielu użytkowników aktualizuje wiersze w tym samym czasie. Możesz również chcieć wiedzieć, ile wierszy i wierszy zostały zaktualizowane bez ponownego wykonywania zapytań względem tabeli.

Załóżmy na przykład, że tworzysz tabelę o nazwie MyTest. Niektóre dane w tabeli można wypełnić, uruchamiając następujące instrukcje Transact-SQL.

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żesz użyć poniższych przykładowych instrukcji Transact-SQL, aby zaimplementować optymistyczną kontrolę współbieżności w tabeli MyTest podczas aktualizacji. Skrypt używa do reprezentowania wartości rowversion z ostatniego odczytu wiersza. Zastąp wartość rzeczywistą wartością rowversion. Przykładem rzeczywistej wartości rowversion jest 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;  

Przykładowe instrukcje Transact-SQL można również umieścić w transakcji. Wysyłając zapytanie do zmiennej @t w zakresie transakcji, możesz pobrać zaktualizowaną kolumnę myKey tabeli bez ponownego pisania zapytania w tabeli MyTest.

Poniżej przedstawiono ten sam przykład z użyciem sygnatury czasowej składni. Zastąp <myTS> rzeczywistym znacznikiem czasu .

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;  

Zobacz też

ALTER TABLE (Transact-SQL)
RZUTOWANIE i konwertowanie (Transact-SQL)
CREATE TABLE (Transact-SQL)
typy danych (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)