KB4503379 - 修正:在 SQL Server 2016 和 2017 中使用外部索引鍵參照檢查運算子時,無法正確評估參考完整性限制式

套用到
SQL Server 2017 Developer Windows SQL Server 2017 Enterprise Windows SQL Server 2017 Enterprise Core Windows SQL Server 2017 Standard Windows

症狀

假設您嘗試從資料表刪除資料,而該資料正在 Microsoft SQL Server 2016 和 2017 的其他資料表中參照。 如果您探索查詢執行計劃,可以看到它使用外部索引鍵參考檢查運算子。 在此情況下,即使其他資料表中未參照要刪除的資料列,您還是可能會收到下列錯誤訊息:

Msg 547, Level 16, State 0, Line Number, Msg 547, Level 16, State 0, Line Number

DELETE 陳述式與 REFERENCE 限制式發生衝突

狀態

Microsoft 已確認這是「適用對象」一節中列出的 Microsoft 產品中的問題。

解決方式

此問題已在下列 SQL Server 累積更新中修正:

備註此問題已在 SQL Server 2016 SP2 的累積更新 6 中修正。

關於 SQL Server 的累積更新:

SQL Server 的每個新累積更新都包含所有 Hotfix 和先前累積更新的所有安全性修正程式。 查看 SQL Server 的最新累積更新:

因應措施

若要解決這個問題,請使用下列其中一個方法:

  • 使用低於 130 的相容性層級來執行此查詢。
  • 變更參考資料表上的索引結構。

更多資訊

從 SQL Server 2016 中的資料庫範圍設定相容性等級 130 開始,查詢執行計畫可以使用外部索引鍵參照檢查運算子,透過參考完整性限制式,驗證其他資料表中的任何資料列是否參照資料表中的資料列。 如果資料表被大量外部資料表參照,則可以使用這類運算子。 在此運算子中,SQL Server 會在每個參照資料表中選擇索引來執行這類檢查。 如果參考資料表具有具有多個索引鍵欄的索引,例如開頭的某些欄不是外部索引鍵的一部分,但其他一些欄是外部索引鍵的一部分。 這可能會導致 SQL Server 執行的檢查不正確。

例如,試想下列結構描述:

建立資料表 tpk (pk int constraint cpk 主索引鍵 clustered)

建立資料表 TFK (A INT, FK INT CONSTRAINT CFK 外部索引鍵參照 TPK, 索引 IA 叢集 (A,FK) )

此類結構描述可能會導致此問題,但如果您將索引 ia 中的欄順序變更為 (fk,a) ,則不會。

參考資料

了解 Microsoft 用來說明軟體更新的術語。