Избегайте несоответствия схемы в системных версиях таблиц

В поисках обходного пути для:

Error: SQL71609: System-versioned current and history tables do not have matching schemes. Mismatched column: 'XXXX'.

При попытке использования системно-версионных (временных) таблиц SQL 2016 в SSDT для Visual Studio 2015.

Я определил базовую таблицу:

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

(Предполагая, что [history] схема правильно создана в SSDT). Это хорошо строит в первый раз.

Если я позже внесу изменения:

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 NULL в NULL не выдает ошибку.) Clean не исправляет вещи.

Мой текущий обходной путь - убедиться, что у меня установлена ​​последняя версия для контроля версий, затем откройте проводник объектов SQL Server, разверните Projects - XXXX папку и перейдите к соответствующей таблице, затем удалите ее. Затем я должен восстановить код (который SSDT удаляет) из системы контроля версий. Эта процедура утомительна, опасна, а не то, что я хочу делать.

Кто-нибудь нашел способ это исправить? Это ошибка?

Я использую Microsoft Visual Studio Professional 2015, Версия 14.0.25431.01, Обновление 3 с SQL Server Data Tools 14.0.61021.0.

2 ответа

Решение

Я могу воспроизвести эту проблему. Мы (команда инструментов SQL Server) будем работать над исправлением этой проблемы в будущей версии SSDT. В то же время, я полагаю, что вы можете обойти это, явно определив таблицу истории (то есть добавьте таблицу истории с ее желаемой схемой в проект), а затем вручную синхронизируйте схему текущей и хронологической таблиц.

Если у вас возникли проблемы с явным определением таблицы истории, попробуйте закрыть Visual Studio, удалить файл DBMDL в корне проекта, а затем снова открыть проект.

Мы только что столкнулись с этой проблемой. Мы нашли обходной путь, закомментировав системные элементы управления версиями таблицы (фактически сделав ее обычной таблицей), построив проект с нужным нам изменением схемы (что успешно), а затем вернув на место строки управления версиями системы (что также успешно).

На всякий случай кто-то столкнулся с такой же проблемой:

Чтобы исправить это, перейдите в папку [YourDatabaseProject]/bin/Debug и очистите ее, а затем выполните сборку, ничего не удаляя.

Надеюсь это поможет!

Другие вопросы по тегам