rowversion (Transact-SQL)rowversion (Transact-SQL)

Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL DatabaseПрименимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database

Тип данных, который представляет собой автоматически сформированные уникальные двоичные числа в базе данных.Is a data type that exposes automatically generated, unique binary numbers within a database. Тип данных rowversion используется в основном в качестве механизма для отметки версий строк таблицы.rowversion is generally used as a mechanism for version-stamping table rows. Размер при хранении — 8 байт.The storage size is 8 bytes. Тип данных rowversion представляет собой увеличивающееся число, которое не сохраняет дату или время.The rowversion data type is just an incrementing number and does not preserve a date or a time. Для записи даты или времени используйте тип данных datetime2.To record a date or time, use a datetime2 data type.

КомментарииRemarks

Каждая база данных имеет счетчик, который увеличивается при каждой операции вставки или обновления в таблице, содержащей столбец типа rowversion в базе данных.Each database has a counter that is incremented for each insert or update operation that is performed on a table that contains a rowversion column within the database. Этот счетчик типа rowversion используется для работы с базами данных.This counter is the database rowversion. Происходит отслеживание относительного времени базы данных, а не действительного времени, которое может быть связано с часами.This tracks a relative time within a database, not an actual time that can be associated with a clock. В таблице может быть только один столбец типа rowversion.A table can have only one rowversion column. Каждый раз при изменении или вставке строки, содержащей столбец типа rowversion, увеличенное значение rowversion вставляется в столбец типа rowversion.Every time that a row with a rowversion column is modified or inserted, the incremented database rowversion value is inserted in the rowversion column. Из-за этого свойства столбец типа rowversion нежелательно использовать в качестве ключа, особенно первичного.This property makes a rowversion column a poor candidate for keys, especially primary keys. Любое обновление, сделанное в строке, изменяет значение rowversion и значение ключа.Any update made to the row changes the rowversion value and, therefore, changes the key value. Если столбец является первичным ключом, старое значение ключа больше недействительно и внешние ключи, ссылающиеся на старое значение, становятся недействительными.If the column is in a primary key, the old key value is no longer valid, and foreign keys referencing the old value are no longer valid. Если на таблицу ссылается динамический курсор, все обновления изменяют положение строк в курсоре.If the table is referenced in a dynamic cursor, all updates change the position of the rows in the cursor. Если столбец является ключом индекса, все обновления в строках данных также приводят к обновлению индекса.If the column is in an index key, all updates to the data row also generate updates of the index. Значение rowversion увеличивается при каждом выполнении инструкции обновления, даже если значения в строке не изменяются.The rowversion value is incremented with any update statement, even if no row values are changed. (Например, если значение в столбце равно 5 и инструкция обновления задает значение 5, это действие считается обновлением, несмотря на отсутствие изменений и значение rowversion увеличивается.)(For example, if a column value is 5, and an update statement sets the value to 5, this action is considered an update even though there is no change, and the rowversion is incremented.)

Тип данных timestamp является синонимом типа данных rowversion и подчиняется правилам поведения синонимов типов данных.timestamp is the synonym for the rowversion data type and is subject to the behavior of data type synonyms. В инструкциях на языке описания данных DDL по возможности используйте rowversion вместо timestamp.In DDL statements, use rowversion instead of timestamp wherever possible. Дополнительные сведения см. в статье Синонимы типов данных (Transact-SQL).For more information, see Data Type Synonyms (Transact-SQL).

Тип данных Transact-SQLTransact-SQL timestamp отличается от типа данных timestamp, определенного в стандарте ISO.The Transact-SQLTransact-SQL timestamp data type is different from the timestamp data type defined in the ISO standard.

Примечание

Синтаксис timestamp является нерекомендуемым.The timestamp syntax is deprecated. В будущей версии Microsoft SQL Server этот компонент будет удален.This feature will be removed in a future version of Microsoft SQL Server. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

В инструкции CREATE TABLE или ALTER TABLE необязательно указывать имя столбца с типом данных timestamp. Рассмотрим пример.In a CREATE TABLE or ALTER TABLE statement, you do not have to specify a column name for the timestamp data type, for example:

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

Если имя столбца не указать, Компонент SQL Server Database EngineSQL Server Database Engine формирует имя столбца типа timestamp. Синоним rowversion не подчиняется этому правилу.If you do not specify a column name, the Компонент SQL Server Database EngineSQL Server Database Engine generates the timestamp column name; however, the rowversion synonym does not follow this behavior. При использовании типа данных rowversion указание имени столбца обязательно.When you use rowversion, you must specify a column name, for example:

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

Примечание

При использовании инструкции SELECT INTO, в которой столбец типа rowversion находится в списке SELECT, могут быть сформированы повторяющиеся значения rowversion.Duplicate rowversion values can be generated by using the SELECT INTO statement in which a rowversion column is in the SELECT list. Использовать тип данных rowversion таким образом не рекомендуется.We do not recommend using rowversion in this manner.

Столбец типа rowversion, который не может принимать значение NULL, семантически эквивалентен столбцу типа binary(8).A nonnullable rowversion column is semantically equivalent to a binary(8) column. Столбец типа rowversion, который может принимать значение NULL, семантически эквивалентен столбцу типа varbinary(8).A nullable rowversion column is semantically equivalent to a varbinary(8) column.

С помощью столбца rowversion можно легко определить, выполнялась ли инструкция обновления применительно к строке с момента ее последнего считывания.You can use the rowversion column of a row to easily determine whether an update statement has been run against the row since the last time it was read. При выполнении инструкции обновления применительно к строке значение rowversion изменяется.If an update statement is run against the row, the rowversion value is updated. Если для строки не выполнялись инструкции обновления, значение rowversion будет таким же, как и при предыдущем считывании.If no update statements are run against the row, the rowversion value is the same as when it was previously read. Чтобы получить текущее значение rowversion для базы данных, используйте функцию @@DBTS.To return the current rowversion value for a database, use @@DBTS.

Столбец rowversion можно добавить в таблицу, чтобы обеспечить целостность базы данных в случаях одновременного обновления строк несколькими пользователями.You can add a rowversion column to a table to help maintain the integrity of the database when multiple users are updating rows at the same time. Также может возникнуть необходимость в данных о количестве строк и указании обновленных строк без отправки повторного запроса в таблицу.You may also want to know how many rows and which rows were updated without re-querying the table.

Например, допустим, что была создана таблица с именем MyTest.For example, assume that you create a table named MyTest. Таблица заполняется данными при выполнении следующих инструкций Transact-SQLTransact-SQL.You populate some data in the table by running the following Transact-SQLTransact-SQL statements.

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  

После этого можно использовать следующие инструкции Transact-SQLTransact-SQL для управления оптимистичным параллелизмом таблицы MyTest при обновлении таблицы.You can then use the following sample Transact-SQLTransact-SQL statements to implement optimistic concurrency control on the MyTest table during the update. Скрипт использует <myRv> для представления значения rowversion на момент последнего считывания строки.The script uses <myRv> to represent the rowversion value from the last time you read the row. Замените это значение фактическим значением rowversion.Replace the value with the actual rowversion value. Примером фактического значения rowversion является 0x00000000000007D3.An example of an actual rowversion value is 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;  

В транзакцию можно также ввести эти образцы инструкций Transact-SQLTransact-SQL.You can also put the sample Transact-SQLTransact-SQL statements into a transaction. При запросе переменной @t в области действия транзакции можно получить обновленный столбец myKey таблицы без отправки повторного запроса в таблицу MyTest.By querying the @t variable in the scope of the transaction, you can retrieve the updated myKey column of the table without requerying the MyTest table.

Ниже приведен тот же пример с использованием синтаксиса timestamp.The following is the same example using the timestamp syntax. Замените <myTS> фактическим значением timestamp.Replace <myTS> with an actual timestamp.

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;  

См. также разделSee also

ALTER TABLE (Transact-SQL)ALTER TABLE (Transact-SQL)
Функции CAST и CONVERT (Transact-SQL)CAST and CONVERT (Transact-SQL)
CREATE TABLE (Transact-SQL)CREATE TABLE (Transact-SQL)
Типы данных (Transact-SQL)Data Types (Transact-SQL)
DECLARE @local_variable (Transact-SQL)DECLARE @local_variable (Transact-SQL)
DELETE (Transact-SQL)DELETE (Transact-SQL)
INSERT (Transact-SQL)INSERT (Transact-SQL)
MIN_ACTIVE_ROWVERSION (Transact-SQL)MIN_ACTIVE_ROWVERSION (Transact-SQL)
SET @local_variable (Transact-SQL)SET @local_variable (Transact-SQL)
UPDATE (Transact-SQL)UPDATE (Transact-SQL)