SQLCLRで使用されているAppDomainを強制的にリセットしたい。 SQL Serverインスタンスを再起動する以外に、どうすればよいですか?
これは少し残忍なことですが、CLRを無効にして再度有効にするとどうなりますか?
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 0;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO
他のすべてのアセンブリに影響を及ぼさない、よりエレガントなソリューションがあります。アプリドメイン内のいずれかのアセンブリのPERMISSION_SETを変更するだけです(アプリドメインはユーザーごとです)。
ALTER Assembly [AssemblyName] WITH PERMISSION_SET = {1 of the 2 levels that
this Assembly is not current at}
PERMISSION_SETを元の状態に戻す必要があることを覚えておいてください。また、PERMISSION_SETを変更するとアンロードされる前に、アセンブリのメソッドにアクセスする必要があります。現在アクティブなアプリドメインに読み込まれていないが、別のアセンブリを使用してアセンブリを変更しても、アプリドメインには影響しません(アプリドメインは、DBごと、ユーザーごと、アセンブリごとではありません)。
[〜#〜]更新[〜#〜]
上記の方法は、その1つのアプリドメインのみをアンロードする最も細かいアプローチです。ただし、アセンブリを他の2つのレベルのいずれかに設定できる必要があります。 SAFE
とマークされたアセンブリの場合、どちらかが
TRUSTWORTHY ON
に設定されている、またはEXTERNAL ACCESS Assembly
またはUNSAFE Assembly
権限のいずれかが付与されているこの場合、単にTRUSTWORTHY
設定ON
をオンにして、すぐにOFF
に戻ると、アンロードされますallその特定のデータベースのアプリドメイン:
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
いずれにしても、データベースにアプリドメインが1つしかない場合(そして、これが95%以上の場合だと思います)、ここで説明する方法はどちらも同じ効果があります。そのような状況では、ALTER DATABASE
メソッドは、特定のオブジェクト名を指定する必要がなく、元のPERMISSION_SET
が何であるかを知る必要もないため、より単純に見えます。
また、アプリドメインが1つしかない場合は、データベースがすでにALTER DATABASE
に設定されているか、適切なキーベースログインを設定している場合でも、TRUSTWORTHY ON
メソッドの方が簡単です。許可。キーベースのログインを使用している場合は、上記のようにTRUSTWORTHY
をON
に設定し、次にOFF
を再度設定できます。ただし、すでにTRUSTWORTHY
をON
に設定している場合は、逆にしてOFF
に設定し、すぐにON
に戻します。
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;