rowversion(Transact-SQL)
적용 대상: SQL Server
Azure SQL Database
Azure SQL Managed Instance
데이터베이스 내에서 자동으로 생성된 고유 이진 숫자를 표시하는 데이터 형식입니다. rowversion 은 일반적으로 버전 스탬핑 테이블 행에 대한 메커니즘으로 사용됩니다. 스토리지 크기는 8바이트입니다. rowversion 데이터 형식은 증분 숫자일 뿐이며 날짜 또는 시간을 유지하지 않습니다. 날짜 또는 시간을 기록하려면 datetime2 데이터 형식을 사용합니다.
설명
각 데이터베이스에는 데이터베이스 내의 rowversion 열이 포함된 테이블에서 수행되는 각 삽입 또는 업데이트 작업에 대해 증분되는 카운터가 있습니다. 이 카운터는 데이터베이스 rowversion입니다. 이는 클록과 연결할 수 있는 실제 시간이 아니라 데이터베이스 내의 상대 시간을 추적합니다. 테이블에는 행 변환 열이 하나 만 있을 수 있습니다 . rowversion 열이 있는 행이 수정되거나 삽입될 때마다 증분된 데이터베이스 rowversion 값이 rowversion 열에 삽입됩니다. 이 속성을 사용하면 rowversion 열이 키, 특히 기본 키에 적합하지 않습니다. 행을 업데이트하면 rowversion 값이 변경되므로 키 값이 변경됩니다. 열이 기본 키에 있는 경우 이전 키 값은 더 이상 유효하지 않으며 이전 값을 참조하는 외래 키는 더 이상 유효하지 않습니다. 테이블이 동적 커서에서 참조되는 경우 모든 업데이트는 커서의 행 위치를 변경합니다. 열이 인덱스 키에 있는 경우 데이터 행에 대한 모든 업데이트도 인덱스의 업데이트를 생성합니다. 행 값이 변경되지 않더라도 rowversion 값은 업데이트 문으로 증가합니다. 예를 들어 열 값이 5이고 update 문이 값을 5로 설정하는 경우 이 작업은 변경 내용이 없고 rowversion 이 증가하더라도 업데이트로 간주됩니다.
timestamp는 rowversion 데이터 형식의 동의어이며 데이터 형식 동의어의 동작이 적용됩니다. DDL 문에서 가능한 경우 타임스탬프 대신 rowversion을 사용합니다. 자세한 내용은 데이터 형식 동의어(Transact-SQL)를 참조하세요.
Transact-SQL timestamp 데이터 형식은 ISO 표준에 정의된 timestamp 데이터 형식과 다릅니다.
참고 항목
타임스탬프 구문은 더 이상 사용되지 않습니다. SQL Server의 이후 버전에서는 이 기능이 제거됩니다. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 애플리케이션은 수정하세요.
CREATE TABLE 또는 ALTER TABLE 문에서는 타임스탬프 데이터 형식의 열 이름을 지정할 필요가 없습니다. 예를 들면 다음과 같습니다.
CREATE TABLE ExampleTable (PriKey int PRIMARY KEY, timestamp);
열 이름을 지정하지 않을 경우 SQL Server 데이터베이스 엔진에서 timestamp 열 이름을 생성하지만 rowversion 동의어는 이 동작을 따르지 않습니다. rowversion을 사용하는 경우 열 이름을 지정해야 합니다. 예를 들면 다음과 같습니다.
CREATE TABLE ExampleTable2 (PriKey int PRIMARY KEY, VerCol rowversion) ;
참고 항목
행 변환 열이 SELECT 목록에 있는 SELECT INTO 문을 사용하여 중복 행 변환 값을 생성할 수 있습니다. 이러한 방식으로 rowversion을 사용하지 않는 것이 좋습니다.
null이 아닌 rowversion 열은 기능적으로 binary(8) 열과 같습니다. nullable rowversion 열은 varbinary(8) 열과 의미상 동일합니다.
행의 rowversion 열을 사용하여 마지막으로 읽은 이후 행에 대해 업데이트 문이 실행되었는지 여부를 쉽게 확인할 수 있습니다. 행에 대해 업데이트 문이 실행되면 rowversion 값이 업데이트됩니다. 행에 대해 업데이트 문이 실행되지 않는 경우 rowversion 값은 이전에 읽었을 때와 동일합니다. 데이터베이스의 현재 rowversion 값을 반환하려면 @@DBTS를 사용합니다.
테이블에 rowversion 열을 추가하여 여러 사용자가 동시에 행을 업데이트할 때 데이터베이스의 무결성을 유지할 수 있습니다. 또한 테이블을 다시 쿼리하지 않고도 얼마나 많은 행이 업데이트되었고 어떤 행이 업데이트되었는지 확인할 수 있습니다.
예를 들어 .MyTest
다음 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
그러고 나서 다음 샘플 Transact-SQL 문을 사용하여 업데이트 중에 MyTest
테이블에 대한 낙관적 동시성 제어를 구현할 수 있습니다. 스크립트는 행을 마지막으로 읽은 시점의 행 변환 값을 나타내는 데 사용합니다<myRv>
. 값을 실제 rowversion 값으로 바꿉니다. 실제 rowversion 값의 예는 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-SQL 문을 트랜잭션에 삽입할 수도 있습니다. 트랜잭션 범위 내에서 @t
변수를 쿼리하면 myKey
테이블을 다시 쿼리하지 않고도 테이블의 업데이트된 MyTest
열을 검색할 수 있습니다.
다음은 타임스탬프 구문을 사용하는 동일한 예제입니다. 실제 타임스탬프로 대체 <myTS>
합니다.
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;
참고 항목
ALTER TABLE(Transact-SQL)
CAST 및 CONVERT(Transact-SQL)
CREATE TABLE(Transact-SQL)
데이터 형식(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)