Visual Studio の Database Project で Temporal Table 使ってると公開が失敗することがある

列の型を変えたり、Temporal Table が要らなくなって、定義から消した場合*1にやられる。。
Cannot change data types of a temporal table columns - Developer Community

回避方法は ↑ に書いてある通り、*.dbmdl 消したり、↓ のような alter で Temporal Table を止めたりしないとダメ。

alter table [HogeTable] set (system_versioning = off)

列の型変えるでエラーを防ごうとした場合、History テーブルもちゃんと CREATE 文で作ってやったらよさそう。

失敗する例:History テーブルを自動で生成しているため、列の型を変更すると失敗する

CREATE TABLE [dbo].[Table1]
(
    [Id] INT NOT NULL PRIMARY KEY,
    [Name] NVARCHAR(20) NOT NULL,
    [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].[Table1_HISTORY], DATA_CONSISTENCY_CHECK=ON))

成功する例:History テーブルを手動で生成しているので、メイン、ヒストリーテーブル両方の列の型を変更すると成功する

create table [Table1History] (
    [Id] INT NOT NULL PRIMARY KEY,
    [Name] NVARCHAR(20) NOT NULL,
    [SysStart] DATETIME2 (7) NOT NULL,
    [SysEnd] DATETIME2 (7) NOT NULL
)
GO
CREATE CLUSTERED INDEX [IX_Table1History] ON [Table1History] ([SysEnd], [SysStart])
GO
create table [Table1] (
    [Id] INT NOT NULL PRIMARY KEY,
    [Name] NVARCHAR(20) NOT NULL,
    [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].[Table1History], DATA_CONSISTENCY_CHECK=ON))
GO

なんでか分からないけど、alter 文で system_versioning の設定しようとするとコンパイルエラーになるので、create 時に設定する必要あり。

Temporal Table 周りはまだ色々動き怪しい。。

定義から消したときに、削除するやつは Database Project の中での対処方法は無さそう。
手動 alter で system_versioning = off してください。

*1:ソースになくて、ターゲットにある場合に削除する