【问题标题】:How do I create system versioned tables using SSDT in Visual Studio 2019?如何在 Visual Studio 2019 中使用 SSDT 创建系统版本表?
【发布时间】:2021-01-16 21:36:33
【问题描述】:

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

  1. 以下架构给出错误:

    SQL70633:系统版本的时态表必须明确提供历史表名。

     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:表:[dbo].[Products] 对表 [history].[ProductsHistory] ​​的引用未解决。
    SQL46010:] 附近的语法不正确。

     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 中尝试过这种语法?两个命令都不包含临时列或 PERIOD 子句。
  • 好的,添加列更改了消息SQL71501: Table: [history].[ProductsHistory] has an unresolved reference to Schema [history].。将 CREATE SCHEMA [history] ​​添加到单独的构建脚本可修复此错误。你想写答案吗?
  • 您也可以使用原始查询,使用匿名历史记录表,只要包含列即可
  • 我直接在 SSDT 中创建了时态表,将它们导入到数据库项目中,然后毫无问题地部署到另一个数据库中
  • 是的,我完全忘记了时间列。你看,我以前从未使用过系统版本控制,错误消息有点误导

标签: sql-server visual-studio-2019 sql-server-data-tools database-project


【解决方案1】:

这两种情况的语法都是无效的。执行 SSMS 中的第一个查询返回:

当未定义 SYSTEM_TIME 时间段时,无法将 SYSTEM_VERSIONING 设置为 ON。

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

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

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 用于指定记录的有效期。

使用用户指定的表名创建时态表需要类似的语法

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))

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

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

CREATE SCHEMA history

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    相关资源
    最近更新 更多