避免系统版本表中的架构不匹配

Posted

技术标签:

【中文标题】避免系统版本表中的架构不匹配【英文标题】:Avoid schema mismatch in System-Versioned tables 【发布时间】:2017-04-17 20:35:15 【问题描述】:

寻找解决方法:

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

(假设[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 更改为CHARVARCHAR(50) 更改为VARCHAR(51);将NOT NULL 更改为NULL 不会产生错误。)执行Clean 并不能解决问题。

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

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

我正在使用 Microsoft Visual Studio Professional 2015,版本 14.0.25431.01 Update 3 和 SQL Server Data Tools 14.0.61021.0。

【问题讨论】:

您的表看起来不像一个有效的系统版本表 - 它缺少 PERIOD FOR SYSTEM TIMEPERIOD 列 - msdn.microsoft.com/en-us/library/mt590957.aspx 你是对的!我在构建示例时忘记包含这些内容。我已经修复了帖子。 我无法通过执行ALTER TABLE 语句在 SQL 2016 RTM 上复制它。您如何更改架构? 我认为这是 Visual Studio 和 SSDT 的问题,而不是 SQL Server 的问题。使用安装了最新 SSDT 的 Visual Studio 2015,创建一个新的 SQL 数据库项目。确保项目设置为构建 SQL Server 2016。添加一个新表,并将上面的 SQL 的第一位放入。构建 SSDT 项目。然后像在第二个代码块中一样更改表 SQL(更改数据类型),然后再次尝试构建。 Visual Studio 应该会抛出错误。 【参考方案1】:

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

【讨论】:

谢谢 - 这对我在 Visual Studio 2019 上非常有用【参考方案2】:

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

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

【讨论】:

这个解决方法很好......很多额外的输入,但它有效。谢谢! 截至 20170512 仍未修复 这可行 - 关闭解决方案/项目,删除 dbmdl 文件,重新打开项目并再次成功构建。疯了。 截至 2019 年 5 月 17 日仍未修复,但上述工作由 @PeterSchott 解决 - 有效。谢谢! 在 VS2019 中未修复,但 @PeterSchott 可以解决问题【参考方案3】:

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

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

希望这会有所帮助!

【讨论】:

以上是关于避免系统版本表中的架构不匹配的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统体系结构和Linux应用版本匹配选择(以frp内网穿透为例)

arcgis报错000346

Android系统架构

宜人贷系统架构——高并发下的进化之路

在 Entity Framework Core 中查询系统版本时态表中的数据

Cassandra 异常缓存架构版本 X 与当前架构版本 Y 不匹配