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

问题描述:

SQL Server 2016系统版本控制很酷。我正在使用免费的开发者版本。谢谢MS!SQL Server 2016无法将系统版本控制添加到关系表中

我无法弄清楚它是否会给我多版本的多对多关系。我有一个拥有角色集合的用户对象,反之亦然。实体框架生成了UserRoles表,该表保存UserRoles之间的关系。我能够使用这篇文章http://sqlhints.com/tag/modify-existing-table-as-system-versioned-temporal-table/启用UserRoles表的系统版本控制。

但是,我无法打开UserRoles。我得到一个错误

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

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

例如,

  • 上6/1 - 用户1有基于role1和role2所,但在6/4
  • - 用户1的角色改为基于role1和role3

所以,如果我想知道的状态我认为只有在UserRoles上打开系统版本才有可能,但这不起作用。

这是可行的还是不支持SQL Server 2016?如果没有,有没有其他办法可以完成?

+0

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

+0

这就是我们最终做的。非常感谢!不知道我怎么能把这个标记为答案。 – user2893547

+0

我会将其放入“答案”部分,以便它可以显示为已回答。 :) –

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

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

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