web-dev-qa-db-ja.com

実行時のAzure SQLマネージドインスタンスでのCLRストアドプロシージャエラー:「ホストストアのアセンブリには、GACのアセンブリとは異なる署名があります」

SQL Server 2012-2017からローカルSQL Serverインスタンスにデプロイしたときに正しく実行されるCLRストアドプロシージャがあります。AzureSQLマネージドインスタンスに正常にデプロイできますが、プロシージャを実行すると次のエラーが発生します。

ファイルまたはアセンブリ 'System.Net.Http、Version = 4.0.0.0、Culture = neutral、PublicKeyToken = b03f5f7f11d50a3a'またはその依存関係の1つを読み込めませんでした。ホストストアのアセンブリは、GACのアセンブリとは異なる署名を持っています。 (HRESULTからの例外:0x80131050)。

プロジェクト参照をいじってみましたが、役に立ちませんでした。マネージドインスタンスにデプロイできるSystem.Net.Http.dllの唯一のバージョンは、実行時にエラーになるバージョンです。

5
JamesP

SQLCLRを使用する場合の要件/微妙な違いの1つは、GACとSQL Serverの両方に読み込まれるすべてのアセンブリが完全に同じバージョンでなければなりません(つまり、パッチレベルだけではなく、メジャー、マイナー。*)。したがって、ローカルインスタンスはすべて4.7.2(またはその他)を使用している可能性がありますが、マネージドインスタンスが4.7、4.7.1、4.8などを使用している場合は、そのエラーが発生します。 System.Net.Http.DLLから取得したものとは異なるバージョンの.NET Frameworkを実行しているサーバー上にローカルインスタンスの1つがあった場合にも、このエラーが発生します。もちろん、あなたが言及したこれらの異なるインスタンスのすべてが同じ物理サーバー上で実行されている場合、いずれにせよ関与するOSは1つだけなので、もちろんそれらはすべて正しく動作します;-)。

マネージドインスタンスで使用されている特定のバージョンを確認し、それをAzureインストールスクリプトで使用する必要があります。同じシグネチャを持つ同様のバージョンへの参照が機能するため、ローカルで同じバージョンを使用する必要はありません。

では、マネージドインスタンスで正確なフレームワークバージョンを見つける方法を教えてください。次のクエリは、その情報を取得するための最良の方法のようです。

SELECT olm.[name], olm.[file_version]
FROM   sys.dm_os_loaded_modules olm
WHERE  olm.[name] LIKE N'%mscoreei.dll%';

O.P.は、上記のクエリは4.7:2623.のバージョンを返したと返信しました
マネージドインスタンス、およびローカル(オンプレミス)システム上の4.7:3190.のバージョン。

これは、「Assembly has Host store has a different sign from Assembly in GAC」エラーの原因です

したがって、これが機能するためには、その特定のバージョンのDLLを見つけてパッケージ化し、マネージドインスタンスにロードする必要があります。

追伸この問題は、サポートされていない.NET Frameworkライブラリを使用することの欠点の1つです。それらはGACに置かれ(通常は正しいですか?)、Windowsの更新(ローカル、またはマネージドインスタンスのホストシステムに対して行う操作)によってバージョンが更新されると、SQLCLRプロジェクトは機能しなくなります。また、サポートされていない新しいフレームワークDLLが混合モードアセンブリ(マネージコードとアンマネージコードの両方)に変換される場合)は、新しいバージョンをSQL Serverに読み込むことができず、そのサポートされていないフレームワークアセンブリを使用しないようにプロジェクトを再コーディングします。

P.P.S. System.Net.Httpを何に使用していますか? Webサービス関連の場合は、 System.Net.HttpWebRequest およびHttpWebResponseクラスを使用するだけです。 WebリクエストのXMLを構築および解析するには、少し追加のコーディングを行う必要がありますが、これらのクラスは完全にサポートされているライブラリに存在します。

O.P. replied back with: "Correct, web services stuff."

その後、O.P。は次のように返信しました。「基本的なSQLCLRを正常にデプロイして実行できました。
HttpWebRequestHttpWebResponseのみを使用したマネージドインスタンスでの手順
Microsoftがネイティブにサポートされているライブラリのリストを拡張するまで、その行を下に行くのが最善だと思います。」

P.P.P.S. HttpWebRequestに基づいてこれを処理するストアドプロシージャがあるため、 SQL# (私が書いたSQLCLRライブラリ)を確認することをお勧めします。内部で管理されているほとんどの(すべてではない)HTTPヘッダーを処理し、カスタムヘッダー(必要に応じてユーザーID /パスワードを含む)を送信し、POST/GETデータを送信します。完全な開示のためですが、無料版はありますが、INET_GetWebPagesは完全版(有料版)のみです。

6
Solomon Rutzky

From Azure SQL DatabaseマネージドインスタンスT-SQLとSQL Serverの違い

マネージドインスタンスはファイル共有やWindowsフォルダーにアクセスできないため、次の制約が適用されます。

  • CREATE Assembly FROM BINARYのみがサポートされています。 CREATE Assembly FROM BINARY を参照してください。

  • CREATE Assembly FROM FILEはサポートされていません。 CREATE Assembly FROM FILE を参照してください。

  • ALTERアセンブリはファイルを参照できません。 ALTER Assembly を参照してください。

以降:

CLRモジュールとリンクサーバーがローカルIPアドレスを参照できない場合があります

マネージドインスタンスとリンクサーバーに配置されたCLRモジュール、または現在のインスタンスを参照する分散クエリは、ローカルインスタンスのIPを解決できない場合があります。このエラーは一時的な問題です。

回避策:可能であれば、CLRモジュールでコンテキスト接続を使用します。

これらの制限の1つがブロックしている可能性があります。そうでない場合は、CLRプロシージャの機能、およびこれらの各制限が適用されないことをどのように確認したかについての情報を質問に追加すると役立ちます。 +CLR +"Managed Instance" を検索すると2つの結果が得られるため、ここで何も当てはまらない場合は、マイクロソフトサポートに連絡することをお勧めします。

2
Aaron Bertrand