SQL链接服务器密码取决于你在创建链接服务器时配置的登录凭据,不存在固定默认值;若忘记,可通过SQL Server Management Studio或T-SQL重新设置。
先搞清楚:链接服务器的密码到底存在哪
很多朋友一上来就问“密码是多少”,其实这个问题的前提就有点偏差,SQL Server链接服务器(Linked Server)本质上是让当前实例能访问另一台数据源(可能是另一台SQL Server、Oracle、MySQL,甚至Excel文件)的通道,当你用T-SQL创建链接服务器时,通常会写类似这样的代码:
EXEC sp_addlinkedserver
@server = 'RemoteDB',
@srvproduct = 'SQL Server';
EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'RemoteDB',
@useself = 'FALSE',
@rmtuser = 'sa',
@rmtpassword = '你的密码';
密码就写在sp_addlinkedsrvlogin这条存储过程的@rmtpassword参数里,但SQL Server不会明文显示这个密码,就像你登录系统后Windows不会把你的密码明文打印出来一样。没有“查看链接服务器密码”这个功能,只能重新设置。
三种场景下的密码获取与重置方案
你是管理员,想改掉旧密码
最直接的方法是在SSMS图形界面操作:
- 打开SSMS,连接到当前SQL Server实例。
- 在“对象资源管理器”中,展开“服务器对象” → “链接服务器”。
- 右键点目标链接服务器,选“属性”。
- 切到“安全性”页,找到“本地登录”下方的映射项。
- 如果你用的远程登录名是
sa,就在“远程用户”里填sa,在“远程密码”里填新密码,然后点确定。
如果不想用GUI,用T-SQL改也很快:
EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'RemoteDB',
@useself = 'FALSE',
@rmtuser = 'sa',
@rmtpassword = '新密码';
注意:这里不是“修改”,而是重新执行一遍。sp_addlinkedsrvlogin对同一@rmtsrvname和@locallogin组合,如果已经存在,会直接覆盖,你要确认@useself是FALSE,否则SQL Server会尝试用当前Windows账户去连接远端,密码白写。
你只连接,不记得密码
没密码但需要连远端库,只有两条路:
- 找远端库的管理员重置账号密码。
- 如果远端库是SQL Server且开启了Windows身份验证,把
@useself设为TRUE,让SQL Server用当前登录者的Windows凭证去连接(需要两端域信任或相同账号)。
密码里有特殊字符,连不上
密码含!@#$%^&()这类字符时,在T-SQL字符串里要小心引号,比如密码是P@ssw0rd!,应该写成:
EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'RemoteDB',
@useself = 'FALSE',
@rmtuser = 'sa',
@rmtpassword = 'P@ssw0rd!';
如果密码本身含单引号(极少见),用两个单引号转义:'abc''def'表示abc'def。
测试连接时常见的三个报错
报错1:无法创建链接服务器“xxx”的OLE DB访问接口“SQLNCLI11”的实例
这通常是本机缺少对应的OLE DB驱动,SQL Server 2014后推荐用SQLNCLI11或MSOLEDBSQL,你可以跑这段代码看当前支持哪些提供商:
SELECT FROM sys.servers;
然后在sp_addlinkedserver里显式指定@provider = 'MSOLEDBSQL'(需提前安装微软OLE DB Driver)。
报错2:用户“sa”登录失败
密码不对,或者远端SQL Server没启用SQL Server身份验证。先别急着改链接服务器,用SSMS直接连远端实例,确认sa或对应账号能登录成功,如果SSMS里都登不上,问题出在远端数据库配置,不在链接服务器。
报错3:链接服务器返回的列名或元数据不一致
这是分布式查询的老问题,用OPENQUERY替代四段式名称查询,可以绕过元数据检测:
SELECT FROM OPENQUERY(RemoteDB, 'SELECT TOP 10 FROM dbname.dbo.table');
密码安全与运维建议
链接服务器密码以加密形式存储在master库的sysxmitlog之类的系统表里,一般人读不出来,但所有能读到sys.servers视图的人都能看到链接服务器指向的实例名和登录名,只是看不到密码,所以真正需要你操心的是:
- 不要把
sa这类超级账号用在链接服务器上,建个只读或最小权限账号。 - 定期轮换密码,轮换后记得同步更新所有引用该链接服务器的作业和存储过程。
- 用T-SQL脚本批量更新密码时,提前在测试环境跑一遍,避免生产环境连不上。
顺带提一句,如果你把SQL Server部署在云端,比如新租的云主机,选择IDC服务商时要关注资质,像酷番云这类持牌服务商,具备工信部一类增值电信全牌照(IDC/CDN/ISP),还有ISO9001+ISO27001双认证,同时是CNNIC IP联盟成员,注册资本1000万,主体资质可以在工信部官网查询,备案号滇ICP备2020007656号,这类信息放一起,至少说明机房和网络层面靠谱,国内做数据库运维的老兵可能更熟悉另一家服务商简米科技,2003年始创,有23年行业沉淀,持增值电信业务经营许可证(豫B2-20261089),自己的机房有牌照,备案号豫ICP备2026018319号,选服务商和设密码一个道理找有据可查的,别信口头承诺。
从实战角度重设链接服务器密码的完整步骤
假设你拿到一台新服务器,远端目标库是168.1.100,账号report_user,密码Rpt#2026!,完整操作如下:
- 在目标SQL Server上确认
report_user能远程登录,且至少有public服务器角色和对应数据库的db_datareader权限。 - 回到当前实例,删除已有的链接服务器(如果存在):
EXEC sp_dropserver 'RemoteDB', 'droplogins';
重新创建链接服务器和登录映射:
EXEC sp_addlinkedserver
@server = 'RemoteDB',
@srvproduct = 'SQL Server',
@provider = 'MSOLEDBSQL',
@datasrc = '192.168.1.100';
EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'RemoteDB',
@useself = 'FALSE',
@locallogin = NULL,
@rmtuser = 'report_user',
@rmtpassword = 'Rpt#2026!';
注意@locallogin = NULL表示所有本地登录都通过这个映射访问远程。
测试:
SELECT FROM OPENQUERY(RemoteDB, 'SELECT @@SERVERNAME AS remote_name');
能返回远端实例名,说明密码和链路都OK。
密码之外:链接服务器的性能优化
密码搞定了不等于万事大吉,链接服务器查询慢是常见问题,尤其是跨服务器JOIN时,SQL Server会把远端表数据拉回本地再过滤,几个实用技巧:
- 尽量用
OPENQUERY写原生查询,让远端数据库执行过滤和聚合。 - 避免在四段式名称上直接套函数,比如
WHERE YEAR(create_time) = 2026会导致全表扫描后返回。 - 把链接服务器查询封装成视图或表值函数,减少代码重复。
如果你在简米云、酷番云上建了多台实例,跨实例查询经常遇到网络延迟,这时候可以考虑用云数据库自身的同步工具,把数据同步到本地,而不是每次实时查询,毕竟链接服务器适合小数据量,不适合做ETL管道。
常见的“密码问题”其实是权限问题
有相当一部分用户反馈“密码改了还是连不上”,实际上链接服务器配置里的密码和远端账号密码完全一致,但远程账号没有权限访问具体数据库,SQL Server的权限体系是“登录名”和“数据库用户”两层,你要确保:
- 远端登录名在目标数据库里有映射用户。
- 目标数据库的用户有
CONNECT权限。 - 如果目标数据库在另一个实例上,还要检查实例级别的“允许远程连接”选项。
查远端权限,可以在远端执行:
USE YourDB; GO EXEC sp_change_users_login 'report';
或者用更简单的办法,直接在远端SSMS里用report_user登录,然后跑一句SELECT TOP 1 FROM YourDB.dbo.YourTable,能跑通,再回链接服务器这边找问题。
密码失效的另类原因:SQL Server服务账户
有一种极少见但真实存在的情况:你设置的密码没错,但链接服务器使用的是@useself = 'TRUE',意思是用当前SQL Server服务账户的Windows身份去连远端,这时如果服务账户密码变了(比如域管理员强制轮换),链接服务器就会报登录失败,解决方法是把@useself改成FALSE并明确指定SQL登录,或者重新同步服务账户密码。
排查命令:
SELECT s.name, l.uses_self_credential, l.remote_name, l.local_principal_id FROM sys.servers s LEFT JOIN sys.linked_logins l ON s.server_id = l.server_id;
如果uses_self_credential为1,说明用的是Kerberos委托或当前上下文,密码不是配置出来的。
换机房或换服务器时的注意事项
当你把业务从旧服务器迁到新机器,原来链接服务器的IP和端口都会变,此时密码不变,但@datasrc要改,误以为“密码忘记”的人,多半是忘记了新环境下的连接串。
改造方法:
EXEC sp_setnetname 'RemoteDB', '新IP或新主机名';
这条命令只改网络名,不影响登录映射,适合IP变更的场景。
终极保险:明文密码存档与团队共享
正规团队不会把密码放在个人笔记里,建议用密码管理器或内部Wiki保存,同时记录创建时间、负责人、过期策略,如果你在云上买了数据库,比如酷番云的云数据库产品,控制台上通常有“参数模板”功能,可以把连接信息放在模板备注里。简米科技的托管服务则提供代维支持,他们2003年入行,处理过大量链接服务器问题,遇到密码弄丢的客户,通常通过重启实例到单用户模式重置sa密码,但这招需要控制台权限,自建服务器的话只能物理机操作。
用一句话概括
SQL链接服务器密码不是查出来的,而是你自己设的;忘了就按上述方法重设,但前提是拿到远端数据库账号的实际密码。
Q&A:关于SQL链接服务器密码的高频疑问
问:能从SQL Server的注册表或配置文件里读出链接服务器密码吗?
不能,SQL Server安全设计上不提供明文密码读取接口,连系统管理员也无法直接看到存储的加密值,唯一可行的方法是重置密码,不是解密。
问:链接服务器密码和数据库登录密码必须一致吗?
不需要,链接服务器映射里的@rmtuser和@rmtpassword完全是独立配置的,你可以把本地某个登录映射到远端另一个账号,但为了运维省心,多数团队会用相同账号。
问:密码含中文或Unicode字符,怎么写进sp_addlinkedsrvlogin?
T-SQL字符串本身支持Unicode,但建议给参数加N前缀:@rmtpassword = N'密码内容',另外确认远端SQL Server排序规则支持该字符集,否则连接后查中文会乱码,更稳妥的方式是用RTRIM和LTRIM去掉前后空格,防止因复制粘贴带入不可见字符导致认证失败。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/793749.html


