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

적용 대상: 예SQL Server 예Azure SQL Database 아니요Azure SQL Data Warehouse 아니요병렬 데이터 웨어하우스 APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

데이터베이스 내에서 자동으로 생성된 고유 이진 숫자를 표시하는 데이터 형식입니다.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.

RemarksRemarks

각 데이터베이스에는 데이터베이스 내에 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.)

timestamprowversion 데이터 형식의 동의어이며 데이터 형식 동의어의 동작에 따라 달라집니다.timestamp is the synonym for the rowversion data type and is subject to the behavior of data type synonyms. DDL 문에서 가능하면 timestamp 대신 rowversion을 사용하세요.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 데이터 형식은 ISO 표준에 정의된 timestamp 데이터 형식과 다릅니다.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 is in maintenance mode and may 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 데이터베이스 엔진SQL Server Database Engine에서 timestamp 열 이름을 생성하지만 rowversion 동의어는 이 동작을 따르지 않습니다.If you do not specify a column name, the SQL Server 데이터베이스 엔진SQL 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 목록에 rowversion 열이 있는 SELECT INTO 문을 사용하면 중복된 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.

null이 아닌 rowversion 열은 기능적으로 binary(8) 열과 같습니다.A nonnullable rowversion column is semantically equivalent to a binary(8) column. null이 아닌 rowversion 열은 기능적으로 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 the row has had an update statement ran against it since the last time it was read. 행에 대해 업데이트 문이 실행되면 rowversion 값이 업데이트됩니다.If an update statement is ran against the row, the rowversion value is updated. 행에 대해 업데이트 문이 실행되지 않으면 rowversion 값이 이전에 읽은 값과 같습니다.If no update statements are ran 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.

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;  

myRv는 마지막으로 행을 읽은 시간을 나타내는 행에 대한 rowversion 열 값입니다.myRv is the rowversion column value for the row that indicates the last time that you read the row. 이 값은 실제 rowversion 값으로 바꾸어야 합니다.This value must be replaced by the actual rowversion value. 예를 들어 실제 rowversion 값은 0x00000000000007D3입니다.An example of the actual rowversion value is 0x00000000000007D3.

또한 예제 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:

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)