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

SQL Server 2019:public用户访问加密LinkedServer的映射权限问题

问题描述

配置了加密连接的LinkedServer PB01_ENC,设置默认映射(映射列表为空),所有访问通过「使用此安全上下文」进行。该配置对拥有sysadmin角色的用户正常生效,但仅拥有public角色的用户执行查询时会报错:

There is no mapping for user x

即使为该public用户添加特定映射(含密码或模拟方式),问题仍未解决。需在不赋予sa权限的前提下,让该用户能执行远程查询。环境为SQL Server 2019,其他未加密的LinkedServer可正常使用。

LinkedServer配置脚本如下:

EXEC master.dbo.sp_addlinkedserver 
            @server = N'PB01_ENC', @srvproduct=N'', 
            @provider=N'SQLNCLI', @datasrc=N'x.x.x.x,9945',
            @provstr=N'Encrypt=yes;TrustServerCertificate=yes;'

EXEC master.dbo.sp_addlinkedsrvlogin 
            @rmtsrvname=N'PB01_ENC',
            @useself=N'False',
            @locallogin=NULL,
            @rmtuser=N'xxx',@rmtpassword='########'

EXEC master.dbo.sp_serveroption 
            @server=N'PB01_ENC', 
            @optname=N'collation compatible', @optvalue=N'false'

EXEC master.dbo.sp_serveroption 
            @server=N'PB01_ENC', 
            @optname=N'data access', @optvalue=N'true'

EXEC master.dbo.sp_serveroption 
            @server=N'PB01_ENC', 
            @optname=N'dist', @optvalue=N'false'

EXEC master.dbo.sp_serveroption 
            @server=N'PB01_ENC', 
            @optname=N'pub', @optvalue=N'false'

EXEC master.dbo.sp_serveroption 
            @server=N'PB01_ENC', 
            @optname=N'rpc', @optvalue=N'true'

EXEC master.dbo.sp_serveroption 
            @server=N'PB01_ENC', 
            @optname=N'rpc out', @optvalue=N'true'

EXEC master.dbo.sp_serveroption 
            @server=N'PB01_ENC', 
            @optname=N'sub', @optvalue=N'false'

EXEC master.dbo.sp_serveroption 
            @server=N'PB01_ENC', 
            @optname=N'connect timeout', @optvalue=N'0'

EXEC master.dbo.sp_serveroption 
            @server=N'PB01_ENC', 
            @optname=N'collation name', @optvalue=null

EXEC master.dbo.sp_serveroption 
            @server=N'PB01_ENC', 
            @optname=N'lazy schema validation', @optvalue=N'false'

EXEC master.dbo.sp_serveroption 
            @server=N'PB01_ENC', 
            @optname=N'query timeout', @optvalue=N'0'

EXEC master.dbo.sp_serveroption 
            @server=N'PB01_ENC', 
            @optname=N'use remote collation', @optvalue=N'true'

EXEC master.dbo.sp_serveroption 
            @server=N'PB01_ENC', 
            @optname=N'remote proc transaction promotion', @optvalue=N'true'
解决办法

1. 确保登录映射配置正确

若同时存在默认映射(@locallogin=NULL)和特定用户映射,需保证特定映射无配置错误。先清理旧映射,再重新添加:

-- 删除目标用户的现有映射(若存在)
EXEC master.dbo.sp_droplinkedsrvlogin @rmtsrvname=N'PB01_ENC', @locallogin=N'你的public用户名'

-- 重新添加正确的特定映射
EXEC master.dbo.sp_addlinkedsrvlogin 
            @rmtsrvname=N'PB01_ENC',
            @useself=N'False',
            @locallogin=N'你的public用户名',
            @rmtuser=N'远程SQL有效用户名',@rmtpassword='远程用户正确密码'

2. 授予用户LinkedServer连接权限

默认情况下,public角色用户无LinkedServer连接权限,需显式授权:

GRANT CONNECT ON LINKED SERVER::PB01_ENC TO [你的public用户名]

3. 授予远程对象访问权限

需为用户授予远程数据库中目标对象的访问权限,示例如下:

-- 授予单表查询权限
GRANT SELECT ON [PB01_ENC].[远程数据库名].[架构名].[表名] TO [你的public用户名]

-- 授予存储过程执行权限
GRANT EXECUTE ON [PB01_ENC].[远程数据库名].[架构名].[存储过程名] TO [你的public用户名]

-- 批量授予某架构下的查询/执行权限
GRANT SELECT, EXECUTE ON SCHEMA::[远程架构名] AT [PB01_ENC] TO [你的public用户名]

4. 验证远程用户权限

确认远程SQL Server中配置的@rmtuser(即脚本中的xxx)拥有访问目标对象的足够权限,避免因远程权限不足导致的隐性报错。


内容的提问来源于stack exchange,提问作者Dorian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:17:56