SQLCLRで使用されているAppDomainを強制的にリセットしたい。SQL Serverインスタンスを再起動する以外に、どうすればよいですか?
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
ALTER ASSEMBLY
アプリドメインをリロード(または少なくともアンロード)しないログ配布を介して伝播されたことがバグだと言っていました。いずれにせよ、私はここで私の答えに追加したさらに簡単な方法を見つけました。この新しい方法をテストする能力があれば、説明したログ配布シナリオでそれが機能するかどうかを知りたいと思っています。
他のすべてのアセンブリに影響を及ぼさない、よりエレガントなソリューションがあります。アプリドメイン内のいずれかのアセンブリの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
と、その特定のデータベース内のすべてのアプリドメインがアンロードされます。
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;
SELECT * FROM sys.dm_clr_appdomains;
。甘い。