无法修改全局权限时,SQL Server创建非对称密钥遇错误求助
解决SQL Server从已签名DLL创建非对称密钥的权限/有效性错误
排查与解决步骤
1. 检查SQL Server服务账户的文件访问权限
SQL Server进程使用自身服务账户(而非你的登录账户)访问文件系统,即使你是数据库所有者,也需要确保服务账户能读取目标DLL文件:
- 打开
C:\Users\Me\MyCode文件夹的属性 → 安全选项卡 - 添加SQL Server服务账户(默认实例为
NT SERVICE\MSSQLSERVER,命名实例为NT SERVICE\MSSQL$<实例名>) - 为该账户分配读取权限,应用设置后重试创建命令
2. 改用公钥文件创建非对称密钥
既然已导出公钥到publicKey.snk,直接用公钥文件创建密钥可绕开DLL的文件访问问题:
USE MyDatabase; CREATE ASYMMETRIC KEY MyUtilsKey FROM FILE = 'C:\Users\Me\MyCode\publicKey.snk';
完成后关联登录并授权:
CREATE LOGIN MyUtilsLogin FROM ASYMMETRIC KEY MyUtilsKey; GRANT UNSAFE ASSEMBLY TO MyUtilsLogin;
最后创建程序集:
CREATE ASSEMBLY MyUtils FROM 'C:\Users\Me\MyCode\MyUtils.dll' WITH PERMISSION_SET = UNSAFE;
3. 验证DLL签名的完整性
sn -v仅能验证签名存在,若DLL仅嵌入公钥(无关联私钥),CREATE ASYMMETRIC KEY FROM EXECUTABLE FILE会失败。执行sn -Tp MyUtils.dll查看输出:
- 若仅显示公钥令牌,说明DLL仅用强名称签名但未嵌入完整密钥对,此时必须使用单独的公钥文件创建密钥
- 若显示完整公钥信息,再回到第一步确认服务账户权限
4. 适配SQL Server 2022的CLR严格安全规则
SQL Server 16.x(2022)默认启用clr strict security,需确保:
- 登录名的
UNSAFE ASSEMBLY权限已正确授予 - 程序集签名与非对称密钥的公钥完全匹配(通过公钥文件创建密钥可自动满足此条件)
内容的提问来源于stack exchange,提问作者Ed Graham
相关产品推荐
相关产品推荐

