1

我最近一直在研究临时表,并将它们成功应用于我的一张表。我需要将它应用到数据库中的其他表,所以我运行了一个类似于下面示例的脚本。但是,在我的第二张桌子上运行它时,我得到了

消息 2714,级别 16,状态 5,第 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

4 回答 4

2

不..你不能在同一个数据库中有两个约束..这篇文章似乎暗示位置和员工表是单独的例子

您还可以查看此答案以了解有关约束的更多信息: https ://stackoverflow.com/a/1397674/2975396

我已经提交了一个拉取请求进行必要的更改,所以这将不再是一个问题

于 2017-08-01T09:10:13.677 回答
1

您的问题是由于您的架构中已经存在这些约束。约束名称必须是唯一的。您可以通过为约束选择不同的名称来解决此问题。使用您的示例,我将创建这样的表:

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

于 2018-07-30T17:02:31.127 回答
0

我也遇到了同样的问题,发现这只是由于约束。在临时表中,您将添加两列有效从和有效到。因此,在更改这些表时,我们将添加DF_ValidFromDF_ValidTo约束。因此,如果您要添加,只需检查您是否已经执行了脚本,否则您需要删除此类约束并执行 alter table 脚本。

于 2017-11-10T12:19:53.503 回答
0

为了完美地工作,只需添加具有不同名称的约束。这将帮助您正确运行执行脚本。我们在我们的项目中做了将近 50 张桌子。

于 2017-11-13T14:08:08.337 回答