如何使用dacpac和sqlpackage.exe部署时间表



我们正在尝试使用SQL Server 2016中的时间表。我们正在SSDT中开发SSDT 15.1.6的SQL脚本2017年,但是我们在尝试部署该问题时会遇到问题在构建过程中生成的DACPAC。

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

创建[dbo]。[testhistory]。[ix_testhistory] ...
执行批次时发生了错误。
更新数据库(失败(
无法部署软件包。
错误SQL72014:.NET SQLCLCLIENT数据提供商:

msg 1913,第16级,状态1,第1行
该操作失败了,因为表" dbo.testhistory"上已经存在具有名称" IX_Testhistory"的索引或统计信息。

错误SQL72045:脚本执行错误。执行脚本:
创建聚类索引[IX_TEST HIXERTORY] 在[dbo]上。

当我们在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

我怀疑,因为我们正在使用带有默认历史记录表的时间表,我们不能让DACPAC创建那些额外的创建语句。由于这有效地导致SQL Server尝试两次创建这些项目,从而导致上述错误。

有人知道我们可能会缺少什么吗?或者,如果您使用DACPAC部署时间表,是使用用户定义的历史表的唯一选择?

我们在时间表和DACPAC之间遇到了许多问题。一些技巧将有很长的路要走:

  • 明确声明历史表 - 这远远超出了人们的想法。添加/删除列时,您可以在历史记录表上定义默认值,从而允许您绕过数据已经在表中时出现的许多问题。
  • 将默认值添加到所有内容 - 这不能被夸大。默认值是DACPAC的最好朋友。
  • 查看脚本 - 很高兴将DACFX视为动手,但事实并非如此。不时查看脚本,您将获得大量的见解(看来您已经是!(
  • 明确命名您的索引-DACFX有时会使用索引/表/其他东西使用临时名称。一致性是国王,对吗?
  • 查看所有发布个人资料选项 - 有时,您在个人资料中没有考虑到一些设置。我们花了很多手动干预才能意识到出版个人资料中有交易脚本的设置。

还研究谁将您的DACPAC变成脚本。VS使用sqlpackage.exe,但有时我会从DACFX DLL中获得不同的结果。这可能是两者之间不同的配置东西,但是很难找到。只需尝试两者,看看是否效果更好。

好运!希望这会有所帮助!

您可以尝试的一个潜在的黑客工作是预部脚本;

https://msdn.microsoft.com/en-us/library/jj889461(v = vs.103(.aspx

它们在"生成部署脚本"和amp;之间执行。"执行部署脚本"。因此,如果您无法避免在索引名称上发生碰撞,则可以在升级前重命名现有索引,这是骇客的,我假设您正在部署/更新实时DB的模式,而不是创建新的DB

btw,列名称为"有效From"&在错误消息中发现的"有效to"来自?如果是自动生成的,则应该是'sysend'&'sysstart'

最新更新