Как предотвратить SQL71609 с SSDT на новой темпоральной таблице (системная версия) - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь использовать временные таблицы SQL Server в Visual Studio 2017 и средствах данных SQL Server (SSDT).

Но сразу появляется следующая ошибка:

SQL71609: System-таблицы версий и таблицы версий не имеют соответствующих схем.Несоответствующий столбец: '[dbo]. [MyTable]. [ValidFrom]'

Я не вижу ошибок.Я что-то пропустил?

Я создал небольшой репозиторий в GIT HUB для воспроизведения

Текущая таблица определяется как:

CREATE TABLE [dbo].[MyTable]
(
    [TenantId] UNIQUEIDENTIFIER NOT NULL CONSTRAINT [DF_MyTable_TenantId] DEFAULT 
                            CAST(SESSION_CONTEXT(N'TenantId') AS UNIQUEIDENTIFIER),
    [Rn] BIGINT IDENTITY(1,1) NOT NULL,
    [Id] UNIQUEIDENTIFIER NOT NULL,
    [PropA] INT NOT NULL,
    [PropB] NVARCHAR(100) NOT NULL,

    [ValidFrom] DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL CONSTRAINT [DF_ValidFrom] DEFAULT CONVERT(DATETIME2, '0001-01-01'),
    [ValidTo] DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL CONSTRAINT [DF_ValidTo] DEFAULT CONVERT(DATETIME2, '9999-12-31 23:59:59.9999999'),
    PERIOD FOR SYSTEM_TIME ([ValidFrom], [ValidTo]),

    CONSTRAINT [PK_MyTable] PRIMARY KEY NONCLUSTERED ([Id]),
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[MyTableHistory]))
GO

CREATE UNIQUE CLUSTERED INDEX [CIX_MyTable] ON [dbo].[MyTable]([Rn])
GO

Итаблица истории:

CREATE TABLE [dbo].[MyTableHistory]
(
    [TenantId] UNIQUEIDENTIFIER NOT NULL,
    [Rn] BIGINT IDENTITY(1,1) NOT NULL,
    [Id] UNIQUEIDENTIFIER NOT NULL,
    [PropA] INT NOT NULL,
    [PropB] NVARCHAR(100) NOT NULL,

    [ValidFrom] DATETIME2,
    [ValidTo] DATETIME2,
);
GO
CREATE CLUSTERED COLUMNSTORE INDEX [COLIX_MyTableHistory]
    ON [dbo].[MyTableHistory];
GO
CREATE NONCLUSTERED INDEX [IX_ImpactHistory_ValidFrom_ValidTo_Id]
    ON [dbo].[MyTableHistory] ([ValidFrom], [ValidTo], [Id]);
GO

1 Ответ

0 голосов
/ 18 февраля 2019

Не совсем уверен, почему вы получаете именно это сообщение об ошибке.
Я проверил ваш код на db fiddle и получил разные ошибки.

Кстати, обратите внимание, что вам не нужно писатьтаблица истории самостоятельно - если вы только задаете ее имя с помощью SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[MyTableHistory]), а не создаете его, SQL Server автоматически сгенерирует его для вас - как можно увидеть в этой скрипке .

Для первой попытки Я получил эту ошибку:

Msg 13518 Уровень 16 Состояние 1 Строка 20 Не удалось установить для SYSTEM_VERSIONING значение ON, поскольку таблица истории 'fiddle_e3d361da65804a39b041c8149132b443.dbo.MyTableHistory 'имеет спецификацию столбца IDENTITY.Попробуйте удалить все спецификации столбцов IDENTITY и повторить попытку.

Поэтому я удалил столбец identity из [Rn] в таблице истории и повторил попытку .Затем я получил эту ошибку:

Сообщение 13530 Уровень 16 Состояние 1 Строка 20 Установка значения SYSTEM_VERSIONING на ON не удалась, поскольку системный столбец «ValidFrom» в таблице истории «fiddle_d6660ab11cdc448dba35790867169a14.dbo.MyTableHistory» соответствует периодустолбец в таблице 'fiddle_d6660ab11cdc448dba35790867169a14.dbo.MyTable' и не может быть обнуляемым.

Поэтому я изменил оба столбца ValidFrom и ValidTo на NOT NULL и, наконец, получил егорабочая .

Рабочая версия скопирована сюда:

CREATE TABLE [dbo].[MyTableHistory]
(
    [TenantId] UNIQUEIDENTIFIER NOT NULL,
    [Rn] BIGINT NOT NULL,
    [Id] UNIQUEIDENTIFIER NOT NULL,
    [PropA] INT NOT NULL,
    [PropB] NVARCHAR(100) NOT NULL,

    [ValidFrom] DATETIME2 NOT NULL,
    [ValidTo] DATETIME2 NOT NULL,
);

CREATE CLUSTERED COLUMNSTORE INDEX [COLIX_MyTableHistory]
    ON [dbo].[MyTableHistory];

CREATE NONCLUSTERED INDEX [IX_ImpactHistory_ValidFrom_ValidTo_Id]
    ON [dbo].[MyTableHistory] ([ValidFrom], [ValidTo], [Id]);


CREATE TABLE [dbo].[MyTable]
(
    [TenantId] UNIQUEIDENTIFIER NOT NULL CONSTRAINT [DF_MyTable_TenantId] DEFAULT CAST(SESSION_CONTEXT(N'TenantId') AS UNIQUEIDENTIFIER),
    [Rn] BIGINT IDENTITY(1,1) NOT NULL,
    [Id] UNIQUEIDENTIFIER NOT NULL,
    [PropA] INT NOT NULL,
    [PropB] NVARCHAR(100) NOT NULL,

    [ValidFrom] DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL CONSTRAINT [DF_ValidFrom] DEFAULT CONVERT(DATETIME2, '0001-01-01'),
    [ValidTo] DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL CONSTRAINT [DF_ValidTo] DEFAULT CONVERT(DATETIME2, '9999-12-31 23:59:59.9999999'),
    PERIOD FOR SYSTEM_TIME ([ValidFrom], [ValidTo]),

    CONSTRAINT [PK_MyTable] PRIMARY KEY NONCLUSTERED ([Id]),
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[MyTableHistory]))


CREATE UNIQUE CLUSTERED INDEX [CIX_MyTable] ON [dbo].[MyTable]([Rn])
...