我在 VS 中有一个数据库项目,我试图从 dll 在 SQL Server 中生成一个非对称密钥。在 SSMS 中,我尝试运行以下命令:
CREATE ASYMMETRIC KEY MyNewKey
FROM EXECUTABLE FILE = N'C:\{path to dll}\MyDBProj.dll'
我得到的错误是“证书、非对称密钥或私钥文件无效或不存在;或者您没有权限。”
有问题的 dll 是使用 SQLCLR 权限级别 = SAFE 构建的
我的假设是它与文件权限有关,但我不知道我需要在文件上允许什么安全权限才能实现这一点。我被告知我应该授予 NETWORK SERVICE 帐户读取权限,我做到了。
这是在具有混合模式身份验证的本地数据库上。我已经以 Windows 用户和 sa 帐户的身份尝试过。
鉴于您使用的是 SQL Server Express LocalDB(它作为您的登录名运行,因此没有权限问题),唯一应该导致此类错误的事情是您没有实际签署程序集。这可以通过项目属性的 SQLCLR 选项卡中的“签名...”按钮在 Visual Studio 中完成。
签署程序集(无论是通过给它一个强名称还是添加证书)将用于签署它的任何公钥放在程序集中。该CREATE ASYMMETRIC KEY
语句将从通过强命名放置在那里的程序集中提取公钥。这与获取用于签署程序集的证书的公钥不同,因为它们是单独存储的。
当然,如果“本地数据库”是指它仅在您的开发工作站上运行,而不是专门的 SQL Server Express LocalDB,那么我猜它会是 SQL Server Express?如果您以自己的身份登录 SQL Server(您说您以 Windows 用户身份尝试过)并且您是 . sysadmin
,那么仍然不应该有任何文件系统权限问题,也不应该有任何创建非对称密钥的问题。
一般的
有关一般使用 SQLCLR 的更多信息,请参阅我在 SQL Server Central: Stairway to SQLCLR上撰写的关于此主题的系列文章。
关于 SQL Server 2017
SQL Server 2017 引入了默认启用的新安全功能(“CLR 严格安全”,高级选项),并要求所有程序集,即使标记为 的程序集SAFE
,都使用非对称密钥(即强名称)或证书进行签名,并且有一个具有UNSAFE ASSEMBLY
权限的登录名(基于用于签署程序集的任何内容)。有关如何使用或不使用 Visual Studio / SSDT 进行这项工作的详细信息,请参阅我的以下两篇文章:
请避免使用新的可信程序集“功能”,因为它的缺陷多于好处,更不用说它一开始就完全没有必要,因为现有功能已经处理了“可信程序集”旨在解决的情况。有关详细信息以及处理现有未签名程序集的正确方法的演示,请参阅:SQLCLR 与 SQL Server 2017,第 4 部分:“可信程序集”——失望。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句