避免系统版本表

时间:2016-12-02 20:46:06

标签: sql-server visual-studio-2015 sql-server-data-tools sql-server-2016 temporal

寻找解决方法:

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

尝试在SSDT for 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

(假设在SSDT中正确创建了[history]模式)。这是第一次建立良好。

如果我以后做出改变:

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更改为CHARVARCHAR(50)更改为VARCHAR(51);将NOT NULL更改为NULL不会产生错误。)执行{ {1}}无法解决问题。

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

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

我使用Microsoft Visual Studio Professional 2015,版本14.0.25431.01 Update 3和SQL Server数据工具14.0.61021.0。

3 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:8)

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

答案 2 :(得分:0)

以防万一有人遇到相同的问题:

解决方法是转到[YourDatabaseProject] / bin / Debug文件夹并清除它,然后在不删除任何内容的情况下进行构建。

希望这会有所帮助!