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

Avoid schema mismatch in System-Versioned tables

正在寻找解决方法:

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

当尝试在 Visual Studio 2015 的 SSDT 中使用 SQL 2016 系统版本(临时)tables 时。

我已经定义了一个基本的 table:

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 不会产生错误。) =20=] 不能解决问题。

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

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

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

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

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

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

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

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

希望对您有所帮助!