2016-06-09 58 views
3

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

我會將其放入「答案」部分,以便它可以顯示爲已回答。 :) –

回答

2

聽起來像是ON UPDATE CASCADE或ON UPDATE DELETE外鍵是問題所在。刪除級聯,並用知道並處理正確關係的刪除過程替換它,你應該沒問題。

就我個人而言,我喜歡知道我的刪除/更新是在做什麼,而不是相信處理所有這些關係的關係。我可以看到潛在的鎖定問題,也知道有時我真的想阻止更新或刪除,而不是讓它在所有未見的表中級聯。

2

ON DELETE CASCADE和ON UPDATE CASCADE不允許在當前表中使用。換句話說,當時間表引用外鍵關係中的表(對應於sys.foreign_keys中的parent_object_id)時,不允許使用CASCADE選項。要解決此限制,請使用應用程序邏輯或在觸發器之後保持主鍵表中的刪除一致性(對應於sys.foreign_keys中的referenced_object_id)。如果主鍵表是臨時的並且引用表是非時間的,則不存在這樣的限制。