Justin Dearing Asked: 2012-08-31 09:34:58 +0800 CST2012-08-31 09:34:58 +0800 CST 2012-08-31 09:34:58 +0800 CST 除了重新启动 SQL Server 之外,还有什么方法可以强制重置 SQLCLR AppDomain? 772 我想强制重置 SQLCLR 使用的 AppDomain。除了重新启动 SQL Server 实例之外,我还能如何做到这一点? sql-server sql-clr 2 个回答 Voted Solomon Rutzky 2014-04-05T20:18:13+08:002014-04-05T20:18:13+08:00 有一个更优雅的解决方案不会影响所有其他程序集:只需更改应用程序域中的一个程序集的 PERMISSION_SET (应用程序域是每个用户)。 ALTER ASSEMBLY [AssemblyName] WITH PERMISSION_SET = {1 of the 2 levels that this assembly is not current at} 请记住,您需要将 PERMISSION_SET 设置回原来的状态。此外,您需要在更改 PERMISSION_SET 之前访问程序集中的方法将卸载它;更改当前未加载到处于活动状态的应用程序域但使用另一个程序集的程序集对应用程序域没有影响(应用程序域是每个数据库、每个用户,而不是每个程序集)。 更新 上述方法是最细粒度的方法,它只会卸载一个应用程序域。但是,它确实要求可以将程序集设置为其他两个级别之一。对于标记为的程序集,SAFE只有在以下情况下才有可能 数据库设置为TRUSTWORTHY ON, 或 程序集已签名,并且基于非对称密钥的登录存在,该非对称密钥本身基于与程序集相同的签名,并且已被授予EXTERNAL ACCESS ASSEMBLY或UNSAFE ASSEMBLY权限 在这种情况下,您可以简单地转动TRUSTWORTHY设置ON,然后立即OFF再次返回,这将卸载该特定数据库中的所有应用程序域: ALTER DATABASE CURRENT SET TRUSTWORTHY ON; ALTER DATABASE CURRENT SET TRUSTWORTHY OFF; 如果无论如何您的数据库中只有一个应用程序域(我怀疑这种情况占 95% 或更多),那么此处描述的两种方法具有相同的净效果。在这种情况下,该ALTER DATABASE方法似乎更简单,因为它不需要指定特定的对象名称,也不需要知道原始对象名称是什么PERMISSION_SET。 此外,如果您只有一个应用程序域,那么ALTER DATABASE即使在数据库已设置为TRUSTWORTHY ON或您已设置具有适当权限的基于密钥的登录的情况下,该方法也会更简单。如果您使用的是基于密钥的登录,那么您可以设置TRUSTWORTHY为ON,然后OFF再设置一次,如上所述。但是,如果您已经TRUSTWORTHY设置为ON,则只需将其反转并设置为OFF,然后立即返回ON: ALTER DATABASE CURRENT SET TRUSTWORTHY OFF; ALTER DATABASE CURRENT SET TRUSTWORTHY ON; Best Answer Hannah Vernon 2012-08-31T10:11:52+08:002012-08-31T10:11:52+08:00 我知道这有点残酷,但是禁用 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 (应用程序域是每个用户)。
请记住,您需要将 PERMISSION_SET 设置回原来的状态。此外,您需要在更改 PERMISSION_SET 之前访问程序集中的方法将卸载它;更改当前未加载到处于活动状态的应用程序域但使用另一个程序集的程序集对应用程序域没有影响(应用程序域是每个数据库、每个用户,而不是每个程序集)。
更新
上述方法是最细粒度的方法,它只会卸载一个应用程序域。但是,它确实要求可以将程序集设置为其他两个级别之一。对于标记为的程序集,
SAFE
只有在以下情况下才有可能TRUSTWORTHY ON
, 或EXTERNAL ACCESS ASSEMBLY
或UNSAFE ASSEMBLY
权限在这种情况下,您可以简单地转动
TRUSTWORTHY
设置ON
,然后立即OFF
再次返回,这将卸载该特定数据库中的所有应用程序域:如果无论如何您的数据库中只有一个应用程序域(我怀疑这种情况占 95% 或更多),那么此处描述的两种方法具有相同的净效果。在这种情况下,该
ALTER DATABASE
方法似乎更简单,因为它不需要指定特定的对象名称,也不需要知道原始对象名称是什么PERMISSION_SET
。此外,如果您只有一个应用程序域,那么
ALTER DATABASE
即使在数据库已设置为TRUSTWORTHY ON
或您已设置具有适当权限的基于密钥的登录的情况下,该方法也会更简单。如果您使用的是基于密钥的登录,那么您可以设置TRUSTWORTHY
为ON
,然后OFF
再设置一次,如上所述。但是,如果您已经TRUSTWORTHY
设置为ON
,则只需将其反转并设置为OFF
,然后立即返回ON
:我知道这有点残酷,但是禁用 CLR 并重新启用它呢?