我有一个 pre-SQL Server 2017 数据库,我将它还原到/升级到 SQL Server 2017。在这个数据库中,我有一个 SQLCLR 程序集。该程序集被标记为,SAFE
因为它不执行任何需要更高级别权限的操作,并且数据库已TRUSTWORTHY
禁用 / OFF
。SQLCLR 函数和存储过程在迁移到 SQL Server 2017 之前按预期工作,但现在当我尝试执行其中任何一个时,我收到以下错误:
消息 10314,级别 16,状态 11,服务器 XXXXXXXXXXX,行 YYYYYY
尝试加载程序集 ID ZZZZZ 时,Microsoft .NET Framework 中发生错误。服务器可能资源不足,或者程序集可能不受信任。再次运行查询,或查看文档以了解如何解决程序集信任问题。有关此错误的更多信息:
System.IO.FileLoadException:无法加载文件或程序集“{assembly_name},版本=0.0.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。发生与安全有关的错误。(来自 HRESULT 的异常:0x8013150A)
我已经确认在服务器/实例上启用了 CLR 集成/SQLCLR。
该错误是
clr strict security
SQL Server 2017 中新的服务器级配置选项的结果。这个新的安全设置不允许创建任何程序集,即使是那些标记为 的程序集,也不允许SAFE
创建或加载到内存中执行,除非:TRUSTWORTHY
(ON
不要这样做,因为这是不必要的安全风险)并且作为数据库所有者的登录名(即[dbo]
用户使用的相同 SID)需要具有UNSAFE ASSEMBLY
权限(如果所有者可能已经拥有该权限)是sa
或sysadmin
固定服务器角色的成员或可能具有CONTROL SERVER
权限)。clr strict security
被禁用/0
(不要这样做,因为它是一个不必要的安全风险)UNSAFE ASSEMBLY
权限(请执行此操作)为了解决这种情况,您需要做的就是执行以下步骤(这些步骤并不困难并且提供最高级别的安全性):
SAFE
集:[master]
(仅限公钥!)UNSAFE ASSEMBLY
权限一个简单的例子(减去可选的备份和私钥删除)是:
可以在 PasteBin 上找到一个完整的工作示例(减去备份和私钥删除):
避免“受信任的程序集”-演示
我的博客文章中提供了有关为什么应该使用证书以及为什么不应该使用“受信任的程序集”来解决此问题的详细说明:
SQLCLR 与 SQL Server 2017,第 4 部分:“受信任的程序集” - 失望
另外,请考虑支持我的请求,即让 Microsoft 删除新的“受信任的程序集”功能,因为它存在许多问题(包括安全问题),并且总体上缺乏使用它的好处:
可信程序集比证书更成问题但功能更少 - 请删除