如何在 Visual Studio 2019 年使用 SSDT 创建系统版本表?
How do I create system versioned tables using SSDT in Visual Studio 2019?
我正在尝试创建 Table 使用数据库项目的系统版本控制。
以下架构给出错误:
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
具有显式名称:
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)
在这种情况下,SysStartTime
和SysEndTime
用于指定记录的有效期。
需要类似的语法来创建具有 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))
我正在尝试创建 Table 使用数据库项目的系统版本控制。
以下架构给出错误:
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
具有显式名称:
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)
在这种情况下,SysStartTime
和SysEndTime
用于指定记录的有效期。
需要类似的语法来创建具有 user-specified table 名称
的临时 tablecreate 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))