5

の回避策を探して:Visual Studio用SSDTで2015年避けスキーマの不一致

をSQL 2016システム・バージョン管理(時間的)のテーブルを使用しようと、私は」とき

Error: SQL71609: System-versioned current and history tables do not have matching schemes. Mismatched column: 'XXXX'. 

CREATE TABLE [dbo].[Example] (
    [ExampleId] INT NOT NULL IDENTITY(1,1) PRIMARY KEY, 
    [ExampleColumn] VARCHAR(50) NOT NULL, 
    [SysStartTime] datetime2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL, 
    [SysEndTime] datetime2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL, 
    PERIOD FOR SYSTEM_TIME (SysStartTime,SysEndTime) 
) 
WITH (SYSTEM_VERSIONING=ON(HISTORY_TABLE=[history].[Example])) 
GO 

[history]スキーマが正しくSSDTで作成されたと仮定):基本的なテーブルを定義しまし。これは、最初はうまくいきます。

私は後で変更を行う場合は、次の

CREATE TABLE [dbo].[Example] (
    [ExampleId] INT NOT NULL IDENTITY(1,1) PRIMARY KEY, 
    [ExampleColumn] CHAR(50) NOT NULL, -- NOTE: Changed datatype 
    [SysStartTime] datetime2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL, 
    [SysEndTime] datetime2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL, 
    PERIOD FOR SYSTEM_TIME (SysStartTime,SysEndTime) 
) 
WITH (SYSTEM_VERSIONING=ON(HISTORY_TABLE=[history].[Example])) 
GO 

次にビルドは、上記のエラーメッセージで失敗します。データ型、長さ、精度、位取りを変更すると、このエラーが発生します。 VARCHARからCHARおよびVARCHAR(50)からVARCHAR(51)に変更すると、NOT NULLNULLに変更してもエラーは発生しません)。Cleanを実行しても問題は解決されません。

最新のバージョンをソースコントロールにチェックインしてから、SQL Serverオブジェクトエクスプローラを開き、Projects - XXXXフォルダを展開し、影響を受けるテーブルに移動して削除します。次に、SSDTが削除するコードをソース管理から復元する必要があります。この手順は退屈で、危険で、私がやりたいことではありません。

誰かがこれを修正する方法を見つけましたか?バグですか?

私はMicrosoft Visual Studio Professional 2015、バージョン14.0.25431.01 Update 3とSQL Server Data Tools 14.0.61021.0を使用しています。

+0

あなたのテーブルは有効なシステムバージョンテーブルのようには見えません。それは 'PERIOD FOR SYSTEM TIME'と' PERIOD'カラムがありません - https://msdn.microsoft.com/en-us/library/mt590957。 aspx –

+0

あなたは正しいです!私は例を構築したときにそれらを含めるのを忘れていました。私はその投稿を修正しました。 –

+0

これは、 'ALTER TABLE'文を実行することでSQL 2016 RTMでこれを複製することはできません。どのようにあなたのスキーマを変更していますか? –

答えて

4

この問題を再現できます。私たち(SQL Serverツールチーム)は、SSDTの将来のバージョンでこの問題を修正するように機能します。その間は、明示的に履歴テーブルを定義する(つまり、履歴テーブルをプロジェクトに追加する)ことで対処でき、現在のテーブルと履歴テーブルのスキーマを手動で同期させることができます。

ヒストリテーブルを明示的に定義する際に問題が発生した場合は、Visual Studioを終了し、プロジェクトルート内のDBMDLファイルを削除してから、プロジェクトを再度開いてみてください。

+0

回避策は良いです...余分なタイピングがたくさんありますが、機能します。ありがとう! –

+2

まだ20170512現在修正されていません –

5

この問題が発生しました。テーブルのシステムバージョニング要素をコメントアウトして(効果的にそれを通常のテーブルにする)、必要なスキーマを変更してプロジェクトを構築した後、システムのバージョンラインを元に戻して回避策を見つけました。成功する)。