SQL Server 2014执行sp_db_sendmail报错:.NET Framework加载程序集失败
解决SQL Server 2014调用邮件存储过程时的程序集加载错误
我之前帮不少同行解决过这个问题,你的错误提示非常典型——核心原因就是负责邮件功能的.NET程序集权限不够,或者数据库的信任属性没开启。咱们一步步来排查修复:
第一步:先搞清楚出问题的程序集是什么
先执行这条SQL,找到ID为65549的程序集的详细信息,重点看它的权限设置:
USE msdb; -- 因为系统自带的sp_send_dbmail默认在msdb库,如果你是自定义存储过程在其他库,替换成对应库名 SELECT name, permission_set_desc FROM sys.assemblies WHERE assembly_id = 65549;
如果查询结果里的permission_set_desc显示是SAFE,那直接就是权限不足——发送邮件需要访问外部资源,必须把权限改成EXTERNAL_ACCESS或者UNSAFE。
第二步:开启数据库的TRUSTWORTHY属性(先解决问题,再谈安全)
默认情况下SQL Server的数据库是不允许程序集访问外部资源的,得先打开TRUSTWORTHY开关:
ALTER DATABASE msdb SET TRUSTWORTHY ON; -- 替换成你的目标数据库名
注意:开启这个属性会有一定安全风险,如果你的环境对安全要求极高,后续可以用证书签名程序集的方式来替代,但先把当前问题解决再说。
第三步:修改程序集的权限级别
根据第一步查到的程序集名称,执行这条语句把权限改成EXTERNAL_ACCESS:
USE msdb; -- 对应库名 ALTER ASSEMBLY [你查到的程序集名称] WITH PERMISSION_SET = EXTERNAL_ACCESS;
如果改完还是报错,再试试UNSAFE级别:
ALTER ASSEMBLY [你查到的程序集名称] WITH PERMISSION_SET = UNSAFE;
第四步:验证修复效果
重新运行你的存储过程,看看还会不会弹出那个程序集加载错误。如果还是不行,那可能是服务器资源真的不够——检查下SQL Server的内存、CPU使用率,有没有其他占用资源的进程,必要的话在业务低峰期重启SQL Server服务试试。
另外补充一点:如果是你自己写的自定义存储过程调用sp_send_dbmail,还要确保执行这个存储过程的账号有msdb库的DatabaseMailUserRole角色权限,但你的错误提示是程序集加载问题,所以优先处理上面的权限设置。
内容的提问来源于stack exchange,提问作者PJD
相关产品推荐
相关产品推荐

