web-dev-qa-db-ja.com

SQL Serverからアセンブリを削除せずにCLRアセンブリを更新する方法

SQL Server(2008 R2)でアセンブリを削除して再作成せずに、CLR関数(またはプロシージャ)アセンブリdllを更新するにはどうすればよいですか?

現在、アセンブリを更新すると(たとえば、新しい関数を追加するため)、SQL Serverはアセンブリをドロップするまで更新されたdllを受け入れません。

DROP Assembly CLRFunctions

Msg 6590, Level 16, State 1, Line 1
DROP Assembly failed because 'CLRFunctions' is referenced by object 'NormalizeString'.

しかし、アセンブリを削除する前に、それを参照するすべての関数を最初に削除する必要があります。

DROP FUNCTION NormalizeString
DROP FUNCTION RemoveDiacritics
DROP FUNCTION RemoveCombiningDiacritics
DROP FUNCTION CombineLigatures
....
DROP FUNCTION PseudolocalizeArabic

そしてthen私はアセンブリをドロップできます:

DROP Assembly CLRFunctions

今私はアセンブリを「作成」する必要があります:

CREATE Assembly CLRFunctions FROM 'c:\foos\CLRFunctions.dll';

そして今、私はそれらを削除する前に登録されたすべてのUDFの宣言をハントする必要があります。

私はむしろアセンブリをupdate更新し、SQL Serverに使用を開始させます。


更新:ランダムに試しましたDBCC FREEPROCCACHEは「再コンパイル」を強制しますが、SQL Serverは引き続き古いコードを使用します。

更新:アセンブリdllを削除しましたCLRFunctions.dll、SQL Serverはコードを実行できます(不可能であるべきコードがなければ)。

20
Ian Boyd

あなたが探していると思いますalter Assembly。 BOLから:

FROM句が指定されている場合、ALTERアセンブリは、提供されているモジュールの最新のコピーに関してアセンブリを更新します。 SQL Serverのインスタンスには、アセンブリに対して既に定義されているCLR関数、ストアドプロシージャ、トリガー、データ型、およびユーザー定義の集計関数が含まれている可能性があるため、ALTER Assemblyステートメントはそれらをアセンブリの最新の実装に再バインドします。この再バインドを実行するには、CLR関数、ストアドプロシージャ、およびトリガーにマップするメソッドが、同じシグネチャで変更されたアセンブリに存在している必要があります。 CLRユーザー定義型およびユーザー定義集計関数を実装するクラスは、依然としてユーザー定義型または集計であるための要件を満たしている必要があります。

同じページの例の1つは、それでうまくいくようです:

ALTER Assembly ComplexNumber 
FROM 'C:\Program Files\Microsoft SQL Server\90\Tools\Samples\1033\Engine\Programmability\CLR\UserDefinedDataType\CS\ComplexNumber\obj\Debug\ComplexNumber.dll' 
17
Ben Thul

Ben Thulの答えに追加すると、これはリモートでかなり簡単に達成できますSQL Server Management StudioのGUIを介して

  1. データベースのオブジェクトエクスプローラー-> [プログラマビリティ]で、[アセンブリ]を右クリックし、[新しいアセンブリ...]を選択します。

  2. 更新したDLLを参照します。

  3. [OK]をクリックする代わりに(同じ名前のアセンブリが既に存在するため失敗します)、[新しいアセンブリ]ウィンドウの上部にある[スクリプト]をクリックします。

    SQLクエリが表示され、「CREATE Assembly」行の後に、選択したDLLである巨大なblobが続きます。

  4. 「CREATE」を「ALTER」に変更して実行します!

スクリプトは、実行する前に削除する必要のある 'AUTHORIZATION'行も作成しました。あなたの走行距離は異なる場合があります。

これが、サーバーへのファイルシステムアクセスのない誰かを助けることを願っています。

マイクロソフトがいつかこれをSSMSのファーストクラスのオペレーションにすることを願っていますが、これが実現するまで、これはかなり簡単な回避策です。

8
F. Shinn

Stackoverflow の答えにヒントが見つかりました:

ALTER Assembly CLRFunctions FROM 'c:\foos\CLRFunctions.dll';
1
Ian Boyd