SQL Server 2017创建视图时出现.NET Framework程序集加载错误
SQL Server 2017 基于快照库创建视图时,.NET程序集加载报错的处置方案
已确认异常仅关联ID为65536的单个程序集、其余视图运行正常,可基本排除服务器整体资源耗尽、CLR服务整体故障的可能性,按以下优先级排查处置:
- 第一步:定位目标程序集的基础配置
在当前实例下执行系统视图查询,匹配程序集ID确认基础属性:
重点核查该程序集的权限集、可见性状态,和其余正常运行的程序集做配置差异比对。SELECT name, assembly_id, permission_set_desc, is_visible FROM sys.assemblies WHERE assembly_id = 65536; - 第二步:处置程序集信任配置异常
若查询结果显示该程序集的权限集为EXTERNAL_ACCESS/UNSAFE级别,且关联数据库的可信属性为关闭状态,会直接触发加载报错:- 所有修改操作需在快照对应的源数据库上执行(快照为只读静态文件,无法直接修改配置),执行配置开启数据库可信状态:
ALTER DATABASE [快照对应的源数据库名称] SET TRUSTWORTHY ON; - 生产环境优先采用非对称密钥签名的方式给对应程序集授权,避免长期开启TRUSTWORTHY属性带来的安全风险。
- 所有修改操作需在快照对应的源数据库上执行(快照为只读静态文件,无法直接修改配置),执行配置开启数据库可信状态:
- 第三步:处置程序集元数据/版本匹配异常
若配置无差异,需排查程序集的绑定一致性问题:- 执行
DBCC CHECKDB ([快照数据库名]) WITH PHYSICAL_ONLY;核查源库文件是否存在物理页损坏,避免程序集元数据读取失败 - 检查近期是否有程序集版本升级、源库替换操作,确认当前程序集版本和视图定义中引用的版本是否匹配,若存在版本错位,在源库中卸载不匹配的残留程序集,重新创建匹配版本的程序集后,重新生成关联的数据库快照
- 执行
- 第四步:处置局部CLR内存加载异常
报错附带的“服务器资源不足”提示,多为单个大体积程序集加载时的地址空间预留冲突,并非整体内存不足:- 重启SQL Server实例服务,清空CLR加载的残留缓存后重试视图创建
- 若重试仍失败,执行
DBCC FREEPROCCACHE;清空实例的计划缓存,释放残留的CLR编译句柄后再验证
注意:所有涉及程序集修改、权限调整的操作,均无法在数据库快照上直接完成,必须在对应的源库上操作完成后,重新生成快照再开展视图创建工作。
内容的提问来源于stack exchange,提问作者Dana
相关产品推荐
相关产品推荐

