KB4046918 - 修正: SQL CLR 関数が SQL Server 2016 および 2017 で偽装呼び出しを使用して Transact-SQL ステートメントを呼び出すと、実行が失敗する

適用先
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 関数は、EXECUTE AS ステートメントを呼び出すなど、偽装呼び出しを使用して Transact-SQL ステートメントを呼び出します。

このシナリオでは、実行が失敗し、次のエラー メッセージが表示されます。

注

  • メッセージ 6522、レベル 16、状態 1、プロシージャ PrcedureName、行 0 [バッチ開始行 LineNumber]
  • ユーザー定義のルーチンまたは集計の "ProcedureName" の実行中に .NET Framework エラーが発生しました:
  • System.Data.SqlClient.SqlException: サーバー プリンシパル "LoginName" が、現在のセキュリティ コンテキストでデータベース "DatabaseName" にアクセスできません。

解決策

この修正プログラムは、SQL Server 2017 の累積的な更新プログラム 1 に含まれています。

SQL Server 2016 の Service Pack の情報

この問題は、次の SQL Server Service Pack で修正されています。

Service Pack 2 (SQL Server 2016)

SQL Server 2017 のビルドについて

SQL Server 2017 の新しいビルドには、以前のビルドであったすべての修正プログラムとセキュリティ修正プログラムが含まれています。 SQL Server 2017 の最新ビルドをインストールすることをお勧めします。

SQL Server の Service Pack について:

Service Pack は累積的であり、 最新の Service Pack には新しい修正プログラムと共に、それ以前の Service Pack に含まれていたすべての修正プログラムが含まれています。 マイクロソフトでは、最新の Service Pack と、その Service Pack 用の最新の累積的な更新プログラムを適用することをお勧めします。 最新の Service Pack をインストールする前に、以前の Service Pack をインストールする必要はありません。 最新の Service Pack と最新の累積的な更新プログラムの詳細については、次の資料の表 1 を参照してください。

SQL Server とそのコンポーネントのバージョン、エディション、および更新プログラムのレベルを確認する方法

状態

Microsoft は、これが "適用対象" セクションに記載されている Microsoft 製品の問題であることを確認しました。

参考資料

マイクロソフトでソフトウェア更新プログラムの説明に使用する用語集を参照してください。