【问题标题】:Temporal Table Constraints时态表约束
【发布时间】:2017-08-01 09:03:15
【问题描述】:

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

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

提前感谢您的帮助。

【问题讨论】:

  • 约束和其他对象一样,需要不同的名字保存在sql server数据默认表中。您只需将名称 DF_validfrom 更改为另一个名称。

标签: sql sql-server temporal temporal-tables


【解决方案1】:

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

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

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

【讨论】:

  • 您的拉取请求发生了什么?文档仍然有这个问题
  • @MartinSmith,其实我记得当时已经修好了。会再检查一遍
  • 这里的链接docs.microsoft.com/en-us/sql/relational-databases/tables/…和搜索ALTER TABLE Product 似乎还是有问题
  • @MartinSmith :这是他们接受的拉取请求(github.com/MicrosoftDocs/sql-docs/commit/…),我可以看到它是正确的..在这两种情况下都是 DF_ValidFrom,现在是 DF_ValidFrom 和 @ 987654327@
  • 啊是的 - 没有发现下划线的区别
【解决方案2】:

您的问题是由于您的架构中已经存在这些约束。 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 之间添加了表名。这应该允许您创建所需的所有临时表。

【讨论】:

  • 运行良好并且答案清晰。只是我们不能在一个部分中使用相同的对象名称。可能的表名、列名等...它的 SQL 服务器 法律
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      相关资源
      最近更新 更多