避免系统版本表中的模式不匹配

And*_*ett 9 sql-server temporal sql-server-data-tools visual-studio-2015 sql-server-2016

寻找解决方法:

Error: SQL71609: System-versioned current and history tables do not have matching schemes. Mismatched column: 'XXXX'.
Run Code Online (Sandbox Code Playgroud)

尝试在SSDT中为Visual Studio 2015使用SQL 2016系统版本(时间)表时.

我已经定义了一个基本表:

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
Run Code Online (Sandbox Code Playgroud)

(假设[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
Run Code Online (Sandbox Code Playgroud)

然后构建失败并显示上面的错误消息.对数据类型,长度,精度或比例的任何更改都将导致此错误.(包括改变从VARCHARCHARVARCHAR(50)VARCHAR(51);改变NOT NULLNULL.不产生错误)做一个Clean不解决的事情.

我目前的解决方法是确保将最新版本签入源代码控制,然后打开SQL Server对象资源管理器,展开Projects - XXXX文件夹并导航到受影响的表,然后将其删除.然后我必须从源代码控制中恢复代码(SSDT删除).这个程序既乏味又危险,而不是我想要做的事情.

有没有人找到解决这个问题的方法?这是一个错误吗?

我正在使用Microsoft Visual Studio Professional 2015,版本14.0.25431.01更新3与SQL Server数据工具14.0.61021.0.

Ste*_*een 10

我可以重现这个问题.我们(SQL Server工具团队)将努力在未来版本的SSDT中修复此问题.与此同时,我相信您可以通过显式定义历史表(即将历史表及其所需的模式添加到项目中)来解决此问题,然后手动保持当前和历史表的模式同步.

如果在显式定义历史表时遇到问题,请尝试关闭Visual Studio,删除项目根目录中的DBMDL文件,然后重新打开项目.

  • 这工作 - 关闭解决方案/项目,删除dbmdl文件,重新打开项目,它再次成功构建.疯. (5认同)
  • 截至20170512尚未确定 (4认同)
  • 截至 2019 年 5 月 17 日仍未修复,但 @PeterSchott 的上述工作 - 有效。谢谢! (3认同)

小智 9

我们刚刚遇到过这个问题.我们通过注释表的系统版本控制元素(有效地使其成为普通表)找到了一种解决方法,使用我们需要的架构更改(成功)构建项目,然后将系统版本控制线放回原位(也是成功).