SQL Server编译含链接服务器查询的存储过程时遇客户端加密不支持错误
解决编译含OPENQUERY的存储过程时的“Encryption not supported on the client”错误
这种情况我碰到过好几次——单独跑OPENQUERY没问题,一放进存储过程编译就炸,而且之前还好好的,确实挺闹心的。结合你用的SQL Server 2014,给你几个实用的排查和解决方向:
检查链接服务器的加密选项
存储过程编译时对链接服务器的配置校验会比单独执行查询更严格。你右键目标链接服务器打开属性,切到「服务器选项」标签页,找到Encrypt这一项:- 如果它设为
True,但你的SQL Server 2014客户端不支持目标服务器用的加密协议(比如TLS 1.2+,2014默认没开这个支持),就会触发错误。可以先改成False试试能不能编译,之后再考虑补补丁升级加密支持。
- 如果它设为
给存储过程指定明确的执行上下文
单独执行OPENQUERY时用的是你当前会话的上下文,但存储过程编译时可能用的是默认的安全上下文,权限或加密配置不匹配。你可以在存储过程里显式指定登录:CREATE PROCEDURE YourProcName AS BEGIN -- 切换到链接服务器的登录账号 EXECUTE AS LOGIN = 'LinkedServerLogin'; SELECT * FROM OPENQUERY(YourLinkedServer, 'SELECT * FROM TargetDB.dbo.TargetTable'); -- 切回原上下文 REVERT; END确保这个登录有访问链接服务器的权限,而且它的加密设置和目标服务器兼容。
给SQL Server 2014补补丁
SQL Server 2014早期版本对TLS 1.2及以上协议的支持是缺失的,如果目标服务器现在强制用了高版本TLS,你的客户端没打补丁就会报加密不支持。赶紧装个最新的累积更新(CU),比如CU6及以后的版本,就能补上TLS 1.2的支持。调整本地客户端的加密配置
打开SQL Server配置管理器,找到「SQL Server Native Client 11.0配置」→「客户端协议」,右键「TCP/IP」看属性:- 如果「加密」设为「强制」,但链接服务器那边的加密配置不匹配,也会出问题。改成「可选」再试试编译存储过程。
重建链接服务器
有时候链接服务器的元数据会莫名其妙出问题,看起来连接正常,但编译时就报错。先删了重建试试:-- 删除链接服务器及关联登录 EXEC sp_dropserver 'YourLinkedServer', 'droplogins'; -- 重新创建链接服务器 EXEC sp_addlinkedserver @server = 'YourLinkedServer', @srvproduct = '', @provider = 'SQLNCLI11', @datasrc = 'TargetServerIP\InstanceName'; -- 添加登录映射 EXEC sp_addlinkedsrvlogin @rmtsrvname = 'YourLinkedServer', @useself = 'False', @locallogin = NULL, @rmtuser = 'TargetLogin', @rmtpassword = 'TargetPassword';
先从这几个方向入手,应该能解决问题。
内容的提问来源于stack exchange,提问作者Justin Russo
相关产品推荐
相关产品推荐

