web-dev-qa-db-ja.com

SQL Serverを再起動する以外に、SQLCLR AppDomainを強制的にリセットする方法はありますか?

SQLCLRで使用されているAppDomainを強制的にリセットしたい。 SQL Serverインスタンスを再起動する以外に、どうすればよいですか?

11
Justin Dearing

これは少し残忍なことですが、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
6
Max Vernon

他のすべてのアセンブリに影響を及ぼさない、よりエレガントなソリューションがあります。アプリドメイン内のいずれかのアセンブリの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メソッドの方が簡単です。許可。キーベースのログインを使用している場合は、上記のようにTRUSTWORTHYONに設定し、次にOFFを再度設定できます。ただし、すでにTRUSTWORTHYONに設定している場合は、逆にしてOFFに設定し、すぐにONに戻します。

ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
8
Solomon Rutzky