SQL Server 2019:隐藏链接服务器同时允许读取其视图数据可行吗?
在SQL Server 2019中隐藏链接服务器并允许访问关联视图的方案
可以实现,核心思路是让视图以拥有链接服务器访问权限的身份执行,同时限制普通用户直接访问链接服务器的权限。以下是具体步骤:
1. 创建专用权限账号
先创建一个拥有链接服务器及远程对象访问权限的登录和用户,用于视图的执行上下文:
-- 创建服务器级登录,赋予链接服务器访问权限 CREATE LOGIN LinkServerProxyLogin WITH PASSWORD = 'YourStrongPasswordHere'; -- 针对特定链接服务器授予访问权限(比全局权限更安全) GRANT SELECT ON LINKED SERVER::YourLinkedServerName TO LinkServerProxyLogin; -- 在目标数据库中创建对应用户 USE YourTargetDB; CREATE USER LinkServerProxyUser FOR LOGIN LinkServerProxyLogin; -- 授予该用户访问远程表的权限(按需调整) GRANT SELECT ON [YourLinkedServerName].[RemoteDB].[RemoteSchema].[RemoteTable] TO LinkServerProxyUser;
2. 创建带执行上下文的视图
创建视图时指定EXECUTE AS子句,让视图以刚才创建的专用账号身份执行:
USE YourTargetDB; CREATE VIEW dbo.RemoteDataView WITH EXECUTE AS 'LinkServerProxyUser' AS SELECT Column1, Column2 -- 建议明确列名而非用* FROM [YourLinkedServerName].[RemoteDB].[RemoteSchema].[RemoteTable]; GO -- 给普通用户授予视图的查询权限 GRANT SELECT ON dbo.RemoteDataView TO YourRegularUser;
3. 限制普通用户访问链接服务器
拒绝普通用户查看链接服务器定义及直接访问远程对象:
-- 拒绝查看链接服务器信息 DENY VIEW DEFINITION ON LINKED SERVER::YourLinkedServerName TO YourRegularUser; -- 拒绝直接访问远程表 DENY SELECT ON [YourLinkedServerName].[RemoteDB].[RemoteSchema].[RemoteTable] TO YourRegularUser;
关于之前登录映射失败的原因
你之前尝试的登录映射如果是将普通用户直接映射到远程账号,可能存在两个问题:一是远程账号权限不足,二是视图默认以当前用户身份执行,若映射配置错误会导致权限验证失败。而通过EXECUTE AS让视图切换到专用权限账号执行,就能绕开普通用户自身的权限限制,同时隐藏链接服务器的直接访问路径。
内容的提问来源于stack exchange,提问作者jackobi
相关产品推荐
相关产品推荐

