我们正在尝试在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之间存在许多问题。一些技巧将大有帮助:
还要研究谁将您的DACPAC转换为脚本。 VS使用SqlPackage.exe,但是有时我从DACFx DLL中得到不同的结果。两者之间的配置可能有所不同,但是很难找出来。尝试两者,看看是否效果更好。
祝你好运!希望这可以帮助!
关于sql-server - 如何使用dacpac和SqlPackage.exe部署时态表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49577201/