web-dev-qa-db-ja.com

タイムスタンプではなくRowversionを使用することをお勧めしますが、SQL Server 2008 R2内に「rowversion」データタイプが見つかりません

このリンクのMS http://msdn.Microsoft.com/en-us/library/ms182776.aspx は、タイムスタンプではなくrowversionデータ型を使用する必要があると述べました。 SQL Server 2008 R2内でRowversionデータ型の列を作成したいのですが、SQL Server 2008 R2 Management Studio内ではそのようなデータ型を見つけることができません。

enter image description here

また、次のステートメントを使用して、タイムスタンプタイプのタイムスタンプという名前の既存の列を変更しようとしたときも同様です。

ALTER TABLE [SkillManagement].[dbo].[Customer]
ALTER COLUMN timestamp rowversion 

私はこのエラーを受け取ります:

Msg 4927, Level 16, State 1, Line 1
Cannot alter column 'timestamp' to be data type timestamp

誰かアドバイスできますか?

[〜#〜]編集[〜#〜]

enter image description here

4
john Gu

rowversiontimestampの単なるエイリアスです。カバーの下では、それらはまったく同じものです。

GUIを使用している場合(2012より前)、timestampを使用する必要があります。 (周辺のヒント:GUIの使用を中止してください。)

しかし、それだけではありません。 DDLを使用してこのテーブルを生成した場合でも、

CREATE TABLE dbo.x(y ROWVERSION);

メタデータのデータ型はtimestampになります:

SELECT t.name 
  FROM sys.types AS t
  INNER JOIN sys.columns AS c
    ON c.system_type_id = t.system_type_id
  INNER JOIN sys.tables AS st
    ON c.[object_id] = st.[object_id]
  INNER JOIN sys.schemas AS s
    ON st.[schema_id] = s.[schema_id]
  WHERE st.name = N'x'
    AND s.name = N'dbo'
    AND c.name = N'y';

このテーブルのスクリプトを生成すると、timestampも含まれます。

CREATE TABLE [dbo].[x](
    [y] [timestamp] NOT NULL
) ON [PRIMARY]

そして実際には:

SELECT * FROM sys.types WHERE name = N'rowversion';

結果:

----
0 row(s) affected.

そのため、システムにはrowversionという名前のタイプさえありません。それを含むすべてのDDLは、DDLがbeforeの前に解析および変換されます。サーバーに対しても実行されます。

Microsoftは、名前の付いていないデータ型を最初に導入して以来、これについて歩み寄った矛盾になっています(これは、SQL標準に違反しているため、日付/時刻データにtimestampデータ型を使用する必要があることを示しています)。 2007年に、これが適切に廃止されるようにお願いしました。 マイコネクトアイテムはまだアクティブですアーカイブ-自由に投票してください。 、ドキュメントが製品の可能な使用法とどのように矛盾するかについてコメントします。

他の人もこれについて書いています

21
Aaron Bertrand

タイムスタンプは、rowversionデータ型の同義語です。

これは [〜#〜] msdn [〜#〜] の記事にあります。

上記の記事で確認できるように、Microsoftはタイムスタンプに非推奨のマークを付けていますが、SQL Server 2012では、Rowversionデータ型でテーブルを作成した場合でも、Mgmt Studioはタイムスタンプを使用します。

1
Joachim Sauer