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



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

我不知道它是否会给我提供多对多关系的版本控制。我有一个User对象,它有一个Roles集合,反之亦然。实体框架已经生成了保持UserRoles之间的关系的UserRoles表。我能够使用本文打开UserRoles表的系统版本控制http://sqlhints.com/tag/modify-existing-table-as-system-versioned-temporal-table/.

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

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

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

例如

6/1上的
  • -用户1有角色1和角色2,但
  • 6/4-用户1的角色更改为角色1和角色3

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

SQL Server 2016是否支持此操作?如果没有,还有其他方法可以实现吗?

需要注意的是,在时态表中对FOREIGN KEY约束使用CASCADE的限制仅适用于SQL Server 2016。在SQL Server 2017中,此限制不再存在。

这是官方文件中的相关部分:

不允许在当前表。换句话说,当时态表引用外键关系中的表(对应于sys.foreign_keys中的parent_object_id)CASCADE选项。要绕过此限制,请使用应用程序逻辑或用于在主键表中保持删除一致性的触发器(对应于sys.foreign_keys中的referenced_object_id)。如果主键表是时态的,而引用表是非时态的,没有这样的限制。

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

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

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

当前表上不允许使用ON DELETE CASCADE和ON UPDATE CASCADE。换句话说,当时态表引用外键关系中的表(对应于sys.foreign_keys中的parent_object_id)时,不允许CASCADE选项。要绕过这个限制,请使用应用程序逻辑或after触发器来保持主键表(对应于sys.foreign_keys中的referenced_object_id)中删除的一致性。如果主键表是临时的,而引用表是非临时的,则没有这样的限制。

最新更新