SQL Server 2016系统版本控制很酷。我使用的是免费的开发者版本。谢谢MS!
我不知道它是否会给我提供多对多关系的版本控制。我有一个User对象,它有一个Roles集合,反之亦然。实体框架已经生成了保持User
和Roles
之间的关系的UserRoles
表。我能够使用本文打开User
和Roles
表的系统版本控制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外键上。删除级联,并用一个知道并处理正确关系的删除过程替换它,你应该会没事的。
就我个人而言,我喜欢知道我的删除/更新在做什么,而不是相信关系能处理所有这些。我可以看到潜在的锁定问题,也知道有时我真的想阻止更新或删除,而不是让它在所有表中级联。