sql-server - 避免系统版本化表中的架构不匹配

标签 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'.

尝试在 Visual Studio 2015 的 SSDT 中使用 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 更改为 CHAR 以及将 VARCHAR(50) 更改为 VARCHAR(51);更改 NOT NULLNULL 不会产生错误。)执行 Clean 并不能解决问题。

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

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

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

最佳答案

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

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

关于sql-server - 避免系统版本化表中的架构不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40940570/

相关文章:

c# - 光标在 Visual Studio 2015 中消失

SSIS包卡在 "Created Execution"状态

reporting-services - 使用 SSDT (SQL Server Data Tools) 编辑 RDL 报告

sql - INSERT INTO WITH 公用表表达式 - SQL Server

mysql - SSMA 迁移错误

sql server update where column in (duplicate values) - 有多少更新?

c# - 如何从 mySql 填充 DataGrid

visual-studio - 类库 vs (Portable) vs (Universal Windows) vs (Portable iOS, Android, Windows)

sql - 未解析的对象 [INFORMATION_SCHEMA] 引用。[表]

sql - 如何使用powershell执行.sql文件?