CLR表值函数执行遇System.Security.SecurityException权限问题求助
CLR表值函数System.Security.SecurityException权限异常解决思路
检查程序集权限级别
SQL Server CLR程序集分三种权限:SAFE(默认,仅访问SQL内部资源)、EXTERNAL_ACCESS(可访问外部系统资源)、UNSAFE(最高权限)。若函数涉及外部资源访问,SAFE权限会触发异常。- 查看当前程序集权限:
SELECT name, permission_set_desc FROM sys.assemblies WHERE name = '你的程序集名称'; - 启用CLR并配置基础权限(SQL Server 2014):
sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'clr enabled', 1; RECONFIGURE; - 重新创建程序集时指定对应权限:
CREATE ASSEMBLY [你的程序集名称] FROM 'D:\你的程序集路径\Assembly.dll' WITH PERMISSION_SET = EXTERNAL_ACCESS;
- 查看当前程序集权限:
确保程序集已强名称签名
EXTERNAL_ACCESS或UNSAFE权限的程序集必须有强名称签名:- 在VS2017中,右键项目→属性→签名→勾选“为程序集签名”,选择或新建强名称密钥文件,重新编译。
- 用工具验证签名:
sn -v 你的程序集.dll
排查代码中的权限敏感操作
- 检查
getNames函数是否包含访问外部资源的逻辑(如文件读取、网络请求、注册表访问等),这类操作需要对应权限。 - 若访问Windows资源,需确保SQL Server服务账号(而非登录用户)拥有该资源的访问权限(比如给服务账号添加文件夹读取权限)。
- 检查
配置数据库信任设置(必要时)
若程序集从本地文件加载,需开启数据库信任:ALTER DATABASE 你的数据库名称 SET TRUSTWORTHY ON;注意:开启
TRUSTWORTHY会增加安全风险,优先考虑用证书/非对称密钥授权的方式替代。验证SQL Server服务账号权限
打开服务管理器→找到SQL Server实例服务→右键属性→登录,确认运行账号,检查该账号对函数涉及的外部资源是否具备足够权限。
内容的提问来源于stack exchange,提问作者MAX_1999
相关产品推荐
相关产品推荐

