You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法修改全局权限时,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 20:02:08