时间表约束

时间:2017-08-01 09:03:15

标签: sql sql-server temporal temporal-tables

我最近一直在查看时态表,并且我已成功将它们应用到我的一个表中。我需要将它应用于数据库中的其他表,因此我运行了一个脚本,如下例所示。但是当我在第二张桌子上运行时,我得到了一个

  

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

提前感谢您的帮助。

4 个答案:

答案 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之间添加了表名称。这应该允许您创建所需的所有时态表。