Мы пытаемся работать с темпоральными таблицами в SQL Server 2016. Мы разрабатываем сценарии SQL в SSDT 15.1.6 в Visual Studio 2017, но у нас возникают проблемы при попытке развернуть dacpac, который создается во время сборки.
Наш dacpac развертывается с использованием SqlPackage.exe
, и мы сталкиваемся с этой ошибкой при попытке развернуть dacpac:
Создание [dbo]. [TestHISTORY]. [Ix_TestHISTORY] ...
Произошла ошибка во время выполнения пакета.
Обновление базы данных (сбой)
Не удалось развернуть пакет.
Ошибка SQL72014: .Net Поставщик данных SqlClient:Msg 1913, уровень 16, состояние 1, строка 1
Операция завершилась неудачно, поскольку индекс или статистика с именем «ix_TestHISTORY» уже существует в таблице «dbo.TestHistory».Ошибка SQL72045: ошибка выполнения сценария. Выполняемый скрипт:
СОЗДАТЬ КЛАСТЕРНЫЙ ИНДЕКС [ix_TestHISTORY] НА [dbo]. [TestHistory] ([SysStart] ASC, [SysEnd] ASC);
Когда мы создаем темпоральную таблицу в 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. После сборки проекта созданный дакпак выглядит так:
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, единственный вариант - использовать определяемые пользователем таблицы истории?