KB4046918 - 修正:當 SQL CLR 函式透過模擬呼叫呼叫 Transact-SQL 語句時,執行失敗SQL Server 2016 及 2017 年

套用到
SQL Server 2017 on Windows (all editions) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use)

症狀

請考慮以下案例:

  • 你在 SQL Server 2016 和 2017 裡都有 SQL CLR 函式。
  • CLR 函式透過模擬呼叫呼叫 Transact-SQL 語句,例如呼叫 EXECUTE AS 語句。

在這種情況下,執行失敗,你會收到以下錯誤訊息:

注意

  • 訊息 6522,第 16 層,狀態 1,程序 代碼名稱,第 0 行 [批次起始行 行號]
  • 在執行使用者定義的例程或彙總的「ProcedureName」時,發生了 .NET Framework 錯誤:
  • System.Data.SqlClient.SqlException:伺服器主體「LoginName」無法在目前的安全情境下存取資料庫「DatabaseName」。

解決方式

此修正包含於 SQL Server 2017 的累積更新 1 中。

SQL Server 2016 服務包資訊

此問題已在以下 SQL Server 服務包中修正:

Service Pack 2 for SQL Server 2016

關於 SQL Server 2017 建置版本

SQL Server 2017 的每個新建置都包含了前一個建置中所有的熱修補與安全修補。 我們建議您安裝最新版本的 SQL Server 2017

關於 SQL Server 服務包:

Service Pack 是累積性的。 每個新版 Service Pack 都包含前一版 Service Pack 中所有的修正程式,以及任何新增的修正程式。 我們的建議是套用該服務包的最新服務包及累積更新。 所以在安裝最新版的 Service Pack 之前,您不需要安裝前一版的 Service Pack。 請使用以下文章中的表1,查詢最新服務包及最新累積更新的更多資訊。

如何確定 SQL Server 及其元件的版本、版本與更新等級

狀態

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

參考資料

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