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
相关产品推荐
相关产品推荐

