SQL Server 2016无法将系统版本控制添加到关系表

时间:2016-06-09 19:21:57

标签: sql-server-2016

SQL Server 2016系统版本控制很酷。我使用的是免费的开发者版本。谢谢MS!

我无法弄清楚它是否会给我许多关系的版本控制。我有一个具有角色集合的User对象,反之亦然。实体框架已生成UserRoles表,其中包含UserRoles之间的关系。我可以使用本文http://sqlhints.com/tag/modify-existing-table-as-system-versioned-temporal-table/UserRoles表启用系统版本控制。

但是,我无法启用UserRoles。我收到错误

  

将SYSTEM_VERSIONING设置为ON失败,因为表有一个带有级联DELETE或UPDATE的FOREIGN KEY。

这是否意味着我们无法知道许多关系的版本控制?

例如。

  • on 6/1 - User1有role1和role2,但是
  • on 6/4 - User1的角色已更改为role1和role3

所以,如果我想知道6/1上用户的状态,我认为只有在UserRoles上启用系统版本控制才有可能,但这不起作用。

这是可行的还是不受SQL Server 2016支持?如果没有,还有其他方法可以实现吗?

3 个答案:

答案 0 :(得分:3)

听起来像ON UPDATE CASCADE或ON UPDATE DELETE外键是问题所在。删除级联并用知道并处理正确关系的删除过程替换它,你应该没问题。

就个人而言,我喜欢知道我的删除/更新正在做什么,而不是相信关系来处理所有这些。我可以看到潜在的锁定问题,并且知道有时候我真的想要阻止更新或删除,而不是让它在所有看不见的表中级联。

答案 1 :(得分:3)

当前表上不允许ON DELETE CASCADE和ON UPDATE CASCADE。换句话说,当临时表引用外键关系中的表时(对应于sys.foreign_keys中的parent_object_id),不允许CASCADE选项。要解决此限制,请使用应用程序逻辑或后触发器来维护主键表中删除的一致性(对应于sys.foreign_keys中的referenced_object_id)。如果主键表是暂时的并且引用表是非时间的,则没有这样的限制。

答案 2 :(得分:1)

请注意,在临时表中对CASCADE约束使用FOREIGN KEY的限制仅适用于SQL Server2016。在SQL Server 2017中,此限制不再存在。

>

这是official documentation中的相关部分:

  

ON DELETE CASCADE和ON UPDATE CASCADE不允许在   当前表。换句话说,当时态表正在引用时   表中的外键关系(对应   sys.foreign_keys中的parent_object_id)不允许使用CASCADE选项。   要变通解决此限制,使用应用程序逻辑或之后   触发以维护主键表中删除操作的一致性   (对应于sys.foreign_keys中的referenced_object_id)。如果   主键表是临时表,引用表是非临时表,   没有这样的限制。

     

>注:此限制仅适用于SQL Server 2016。级联选项   从CTP开始在SQL数据库和SQL Server 2017中受支持   2.0。