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

use*_*547 5 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.

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

例如.

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

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

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

Chr*_*iss 6

这是对通知重要的是使用的限制,CASCADEFOREIGN KEY在时态表的限制仅适用于SQL Server 2016在SQL Server 2017年,这一限制已经不存在了。

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

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

>注意:此限制仅适用于SQL Server 2016。从CTP 2.0开始,SQL数据库和SQL Server 2017支持CASCADE选项。


Pet*_*ott 4

听起来好像问题在于 ON UPDATE CASCADE 或 ON UPDATE DELETE 外键。删除级联并将其替换为知道并处理正确关系的删除过程,您应该没问题。

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