如何在 Visual Studio 2019 年使用 SSDT 创建系统版本表?

How do I create system versioned tables using SSDT in Visual Studio 2019?

我正在尝试创建 Table 使用数据库项目的系统版本控制。

  1. 以下架构给出错误:

    SQL70633: System-versioned temporal table must have history table name explicitly provided.

     CREATE TABLE [dbo].[Products]
     (
         [Id] INT NOT NULL PRIMARY KEY, 
         [Name] NVARCHAR(255) NOT NULL, 
         [ModifiedBy] NVARCHAR(127) NULL
     )
     WITH (SYSTEM_VERSIONING = ON)
     GO
    
  2. 具有显式名称:

    SQL71501: Table: [dbo].[Products] has an unresolved reference to Table [history].[ProductsHistory].
    SQL46010: Incorrect syntax near ].

     CREATE TABLE [dbo].[Products]
     (
         [Id] INT NOT NULL PRIMARY KEY, 
         [Name] NVARCHAR(255) NOT NULL, 
         [ModifiedBy] NVARCHAR(127) NULL
     )
     WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = [history].ProductsHistory))
     GO
    

我都试过了,最新版本 Visual Studio 2019 (16.7.5) 和最新预览版 (16.8.0 Preview 3.2)。

两种情况下的语法均无效。在 SSMS returns:

中执行第一个查询

Cannot set SYSTEM_VERSIONING to ON when SYSTEM_TIME period is not defined.

该命令需要一个 PERIOD FOR SYSTEM_TIME 子句来指定用于指定记录有效期的列。

documentation examples 展示了如何使用默认的、自动命名的历史记录创建临时 table table :

CREATE TABLE [dbo].[Products]
 (
     [Id] INT NOT NULL PRIMARY KEY, 
     [Name] NVARCHAR(255) NOT NULL, 
     [ModifiedBy] NVARCHAR(127) NULL,

     SysStartTime DATETIME2 GENERATED ALWAYS AS ROW START NOT NULL,
     SysEndTime DATETIME2 GENERATED ALWAYS AS ROW END NOT NULL,
     PERIOD FOR SYSTEM_TIME (SysStartTime,SysEndTime)
 )
 WITH (SYSTEM_VERSIONING = ON)

在这种情况下,SysStartTimeSysEndTime用于指定记录的有效期。

需要类似的语法来创建具有 user-specified table 名称

的临时 table
create TABLE [dbo].[Products]
 (
     [Id] INT NOT NULL PRIMARY KEY, 
     [Name] NVARCHAR(255) NOT NULL, 
     [ModifiedBy] NVARCHAR(127) NULL,

     SysStartTime DATETIME2 GENERATED ALWAYS AS ROW START NOT NULL,
     SysEndTime DATETIME2 GENERATED ALWAYS AS ROW END NOT NULL,
     PERIOD FOR SYSTEM_TIME (SysStartTime,SysEndTime)
 )
 WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.ProductHistory))

可以在不同的架构上创建历史记录 table,例如 history,只要该架构存在即可,但这可能不是一个好主意,除非这可以解决某些特定问题。当前和历史 table 代表相同的实体,相互依赖并且具有特定的 security restrictions 因此将它们存储在不同的模式中会使生活变得更加困难。

要在单独的架构中创建 table,首先创建架构:

CREATE SCHEMA history

然后使用table定义中的模式:

 WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = history.ProductHistory))