SQL Serverでは、 rowversion データベース内で自動的に生成された一意の2進数を公開するデータ型です。これにより、テーブルの行に一意の値をバージョンスタンプできます。これは、複数のユーザーが同時に行を更新しているときにデータベースの整合性を維持するのに役立ちます。
各SQLServerデータベースには、行バージョンの列を含むテーブルで実行される挿入または更新操作ごとにインクリメントされるカウンターがあります。 データ型(またはそのタイムスタンプ 同義語。非推奨のフラグが立てられています。
テーブルに行バージョンが含まれている場合 (またはタイムスタンプ )列、行が挿入または更新されるたびに、行バージョンの値 columnは現在のrowversion値に設定されます。これは、UPDATE
の場合でも当てはまります。 ステートメントによってデータが変更されることはありません。
例1–行バージョン列を持つテーブルを作成する
行バージョンを使用してテーブルを作成する例を次に示します。 桁。
CREATE DATABASE Test_rowversion; USE Test_rowversion; CREATE TABLE Pet ( PetId int IDENTITY(1,1) PRIMARY KEY, PetName varchar(255), VersionStamp rowversion ); SELECT @@DBTS AS Before; INSERT INTO Pet (PetName) VALUES ('Max'); SELECT @@DBTS AS After;
結果:
Commands completed successfully. Changed database context to 'Test_rowversion'. Commands completed successfully. +--------------------+ | Before | |--------------------| | 0x00000000000007D0 | +--------------------+ (1 row affected) (1 row affected) +--------------------+ | After | |--------------------| | 0x00000000000007D1 | +--------------------+ (1 row affected)
結果の「前」と「後」の値を見てください。これは、現在の行バージョンを表します 値。
この場合、新しいデータベースとテーブル、および rowversionを作成しました。 値は0x00000000000007D0
で始まります 。行を挿入したら、行バージョン 0x00000000000007D1
にインクリメントされました 。
例2–更新
前述のように、行バージョン 更新を行うと、値も増分されます。
例:
SELECT * FROM Pet; UPDATE Pet SET PetName = 'Maxine' WHERE PetId = 1; SELECT * FROM Pet;
結果:
+---------+-----------+--------------------+ | PetId | PetName | VersionStamp | |---------+-----------+--------------------| | 1 | Max | 0x00000000000007D1 | +---------+-----------+--------------------+ (1 row affected) (1 row affected) +---------+-----------+--------------------+ | PetId | PetName | VersionStamp | |---------+-----------+--------------------| | 1 | Maxine | 0x00000000000007D2 | +---------+-----------+--------------------+ (1 row affected)
ここでは、PetName
を更新します 列、およびVersionStamp
列(行バージョン )は0x00000000000007D2
にインクリメントされます 。
例3–変更なしの更新
行バージョンの優れた点の1つ すべてのUPDATE
でインクリメントされるということです 操作変更が行われない場合でも 。
たとえば、前のコードを再度実行すると、VersionStamp
の値が 変更が行われていなくても、列は変更されます:
SELECT * FROM Pet; UPDATE Pet SET PetName = 'Maxine' WHERE PetId = 1; SELECT * FROM Pet;
結果:
+---------+-----------+--------------------+ | PetId | PetName | VersionStamp | |---------+-----------+--------------------| | 1 | Maxine | 0x00000000000007D2 | +---------+-----------+--------------------+ (1 row affected) (1 row affected) +---------+-----------+--------------------+ | PetId | PetName | VersionStamp | |---------+-----------+--------------------| | 1 | Maxine | 0x00000000000007D3 | +---------+-----------+--------------------+ (1 row affected)
PetId
の値 およびPetName
列は変更されませんでしたが、VersionStamp
列がインクリメントされました。
例4–タイムスタンプデータ型
タイムスタンプ データ型は行バージョンの同義語です 。ただし、タイムスタンプ は、SQLServerの将来のバージョンで非推奨のフラグが立てられたデータ型の1つです。当然のことながら、Microsoftは、新しい開発作業でこの機能を使用することを避け、現在この機能を使用しているアプリケーションを変更することを計画することをお勧めします。
したがって、タイムスタンプを使用するデータベースに遭遇した場合 データ型の場合は、行バージョンに変更することを検討してください。 。
デモンストレーションの目的で、タイムスタンプを使用する最初の例を変更します。 行バージョンの代わりに :
CREATE DATABASE Test_timestamp; USE Test_timestamp; CREATE TABLE Pet ( PetId int IDENTITY(1,1) PRIMARY KEY, PetName varchar(255), timestamp ); SELECT @@DBTS AS Before; INSERT INTO Pet (PetName) VALUES ('Max'); SELECT @@DBTS AS After;
結果:
Commands completed successfully. Changed database context to 'Test_timestamp'. Commands completed successfully. +--------------------+ | Before | |--------------------| | 0x00000000000007D0 | +--------------------+ (1 row affected) (1 row affected) +--------------------+ | After | |--------------------| | 0x00000000000007D1 | +--------------------+ (1 row affected)
その間、タイムスタンプ用に変更された次の例を次に示します。 :
SELECT * FROM Pet; UPDATE Pet SET PetName = 'Maxine' WHERE PetId = 1; SELECT * FROM Pet;
結果:
+---------+-----------+--------------------+ | PetId | PetName | timestamp | |---------+-----------+--------------------| | 1 | Max | 0x00000000000007D1 | +---------+-----------+--------------------+ (1 row affected) (1 row affected) +---------+-----------+--------------------+ | PetId | PetName | timestamp | |---------+-----------+--------------------| | 1 | Maxine | 0x00000000000007D2 | +---------+-----------+--------------------+ (1 row affected)
タイムスタンプの名前を実際に提供しなかったことにお気づきかもしれません。 桁。列名を指定しない場合、SQLServerデータベースエンジンはタイムスタンプを生成します 列名。
ただし、行バージョン この構文は許可されていないため、 rowversionを使用する場合は列名を指定する必要があります 。