我最近一直在查看时态表,并且我已成功将它们应用到我的一个表中。我需要将它应用于数据库中的其他表,因此我运行了一个脚本,如下例所示。但是当我在第二张桌子上运行时,我得到了一个
Msg 2714,Level 16,State 5,Line 1已经有一个名为的对象 ' DF_ValidFrom'在数据库中。
下面的文章似乎暗示您可以在Product和Location以及表中使用相同的约束。任何人都有将现有表格改为时态表的经验吗?
ALTER TABLE Product
ADD
SysStartTime datetime2 (2) GENERATED ALWAYS AS ROW START HIDDEN
constraint DF_ValidFrom DEFAULT DATEADD(second, -1, SYSUTCDATETIME())
, SysEndTime datetime2 (2) GENERATED ALWAYS AS ROW END HIDDEN
constraint DF_ValidTo DEFAULT '9999.12.31 23:59:59.99'
, PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime);
ALTER TABLE Product
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.ProductHistory));
ALTER TABLE [Location]
ADD
SysStartTime datetime2 (2) GENERATED ALWAYS AS ROW START HIDDEN
constraint DF_ValidFrom DEFAULT DATEADD(second, -1, SYSUTCDATETIME())
, SysEndTime datetime2 (2) GENERATED ALWAYS AS ROW END HIDDEN
constraint DF_ValidTo DEFAULT '9999.12.31 23:59:59.99'
, PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime);
ALTER TABLE [Location]
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.LocationHistory));
全文在这里 https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-table-usage-scenarios
提前感谢您的帮助。
答案 0 :(得分:2)
不..你不能在同一个数据库中有两个约束。这篇文章似乎暗示了位置和员工表作为单独的例子
您还可以查看有关限制的更多答案: https://stackoverflow.com/a/1397674/2975396
我已经提交了一个拉取请求进行了必要的更改,因此这不再是一个问题
答案 1 :(得分:0)
我也遇到了同样的问题,发现它仅仅是因为约束。 在时态表中,您将添加两个有效且有效的列 。在改变这些表时,我们正在添加 DF_ValidFrom 和 DF_ValidTo 约束。 因此,如果您要添加,请检查您是否已经执行了脚本 否则你需要删除这样的约束并执行alter table script。
答案 2 :(得分:0)
为了完美的工作,只需添加不同名称的约束。 这将帮助您正确运行脚本。 我们在我们的项目中做了将近50个表。
答案 3 :(得分:0)
您的问题是由于这些约束已经存在于您的架构中。 Constraint names must be unique。您可以通过为约束选择其他名称来解决此问题。使用您的示例,我将这样创建表:
ALTER TABLE Product
ADD
SysStartTime datetime2 (2) GENERATED ALWAYS AS ROW START HIDDEN
constraint DF_Prodcut_ValidFrom DEFAULT DATEADD(second, -1, SYSUTCDATETIME())
, SysEndTime datetime2 (2) GENERATED ALWAYS AS ROW END HIDDEN
constraint DF_Prodcut_ValidTo DEFAULT '9999.12.31 23:59:59.99'
, PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime);
ALTER TABLE Product
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.ProductHistory));
ALTER TABLE [Location]
ADD
SysStartTime datetime2 (2) GENERATED ALWAYS AS ROW START HIDDEN
constraint DF_Location_ValidFrom DEFAULT DATEADD(second, -1, SYSUTCDATETIME())
, SysEndTime datetime2 (2) GENERATED ALWAYS AS ROW END HIDDEN
constraint DF_Location_ValidTo DEFAULT '9999.12.31 23:59:59.99'
, PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime);
ALTER TABLE [Location]
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.LocationHistory));
如您所见,我刚刚在约束名称中的DF和ValidFrom / ValidTo之间添加了表名称。这应该允许您创建所需的所有时态表。