Answers:
我知道这有点残酷,但是禁用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
没有重新加载(或至少卸载)App Domain的日志传送所传播的错误。无论哪种方式,我都找到了一个更简单的方法,该方法已添加到此处的答案中。如果您有能力测试这种新方法,那就太好了,我非常想知道它是否在您描述的日志传送方案中有效。
有一个更优雅的解决方案,它不会影响所有其他程序集:只需更改应用程序域中一个程序集的PERMISSION_SET(应用程序域是针对每个用户的)。
ALTER ASSEMBLY [AssemblyName] WITH PERMISSION_SET = {1 of the 2 levels that
this assembly is not current at}
请记住,您需要将PERMISSION_SET设置回原来的值。同样,您需要在程序集中访问方法,然后才能更改PERMISSION_SET以将其卸载;更改当前未加载到活动的应用程序域中但使用另一个程序集的程序集对应用程序域没有影响(应用程序域是按数据库,按用户,而非按程序集)。
更新
上述方法是最细粒度的方法,它将仅卸载该一个App Domain。但是,确实需要将组件设置为其他两个级别之一。对于标记为的装配件,SAFE
只有在
TRUSTWORTHY ON
,或EXTERNAL ACCESS ASSEMBLY
或UNSAFE ASSEMBLY
许可在这种情况下,您可以简单地打开TRUSTWORTHY
设置ON
,然后立即OFF
再次返回,这将卸载该特定数据库中的所有 App Domain:
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
如果数据库中仍然只有一个App Domain(我怀疑是95%或更多的情况是这种情况),那么这里描述的两种方法都具有相同的实际效果。在这种情况下,该ALTER DATABASE
方法似乎更简单,因为它不需要指定特定的对象名称,也不需要知道原始对象PERMISSION_SET
是什么。
另外,如果您只有一个App Domain,那么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;
。甜。