我们正在尝试在SQL Server 2016中使用时态表。我们正在Visual Studio 2017中的SSDT 15.1.6中开发SQL脚本,但是在尝试部署在构建期间生成的dacpac时遇到问题。

我们的dacpac是使用SqlPackage.exe部署的,在尝试部署dacpac时会遇到此错误:



当我们在SSDT中创建时态表时,我们具有以下内容:

CREATE TABLE [dbo].[Test]
(
    [Id] INT NOT NULL PRIMARY KEY,
    [SysStart] DATETIME2 (7) GENERATED ALWAYS AS ROW START NOT NULL,
    [SysEnd] DATETIME2 (7) GENERATED ALWAYS AS ROW END NOT NULL,
    PERIOD FOR SYSTEM_TIME ([SysStart], [SysEnd])
)
WITH (SYSTEM_VERSIONING = ON(HISTORY_TABLE=[dbo].[TestHISTORY], DATA_CONSISTENCY_CHECK=ON))

据我所知,这个问题与dacpac的创建有关。构建项目后,创建的dacpac如下所示:
CREATE TABLE [dbo].[test]
(
    [Id]       INT NOT NULL PRIMARY KEY CLUSTERED ([Id] ASC),
    [SysStart] DATETIME2 (7) GENERATED ALWAYS AS ROW START NOT NULL,
    [SysEnd]   DATETIME2 (7) GENERATED ALWAYS AS ROW END   NOT NULL,
    PERIOD FOR SYSTEM_TIME ([SysStart], [SysEnd])
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE=[dbo].[testHISTORY], DATA_CONSISTENCY_CHECK=ON));
GO

CREATE TABLE [dbo].[testHISTORY]
(
    [Id]       INT           NOT NULL,
    [SysStart] DATETIME2 (7) NOT NULL,
    [SysEnd]   DATETIME2 (7) NOT NULL
);
GO

CREATE CLUSTERED INDEX [ix_testHISTORY]
    ON [dbo].[testHISTORY]([SysEnd] ASC, [SysStart] ASC);
GO

我怀疑是因为我们使用的是temporal table with a default history table,所以我们无法让dacpac创建这些额外的创建语句。由于这实际上导致SQL Server尝试两次创建这些项目,从而导致上述错误。

有人知道我们可能会缺少什么吗?或者,如果您正在使用dacpac部署时态表,那么使用user-defined history tables是您唯一的选择吗?

最佳答案

临时表和DACPAC之间存在许多问题。一些技巧将大有帮助:

  • 显式声明历史记录表-这超出了人们的想象。添加/删除列时,可以在历史记录表上定义默认值,从而可以绕过表中已有数据时出现的许多问题。
  • 将默认值添加到EVERYTHING-这不能被夸大。默认值是DACPAC的最好 friend 。
  • 查看脚本-可以轻松地将DACFx认为是不错的选择,但事实并非如此。偶尔查看一下脚本,您将获得大量的见解(看来您已经是!)
  • 明确命名索引-DACFx有时将临时名称用于索引/表/其他内容。一致性是国王,对不对?
  • 查看所有发布配置文件选项-有时,您在配置文件中没有想到某些设置。在我们意识到发布配置文件中存在用于事务脚本的设置之前,我们花费了很多手动干预。

  • 还要研究谁将您的DACPAC转换为脚本。 VS使用SqlPackage.exe,但是有时我从DACFx DLL中得到不同的结果。两者之间的配置可能有所不同,但是很难找出来。尝试两者,看看是否效果更好。

    祝你好运!希望这可以帮助!

    关于sql-server - 如何使用dacpac和SqlPackage.exe部署时态表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49577201/

    10-10 03:26