我们在两个链接的独立服务器盒上有两个数据库实例。网站用户需要能够在 DatabaseA 上运行查询 DatabaseB 表的存储过程,但是它不应该能够直接从 DatabaseB 上的表中读取。
在 Sql Server 2005 中可能发生这样的事情吗?
简单地创建一个存储过程并授予 Web 用户执行它的权限会返回错误Access to the remote server is denied because no login-mapping exists.
我真的不想让网站用户帐户免费访问 DatabaseB 表。
更新
Aaron 关于使用的建议EXECUTE AS OWNER
无效,因为Owner
无权访问 DatabaseB。
使用EXECUTE AS 'UserWithPermissions'
返回错误Access to the remote server is denied because the current security context is not trusted
。在线查看使我相信这是因为数据库未标记为TRUSTWORTHY,因此远程数据库拒绝连接。我怀疑如果两个数据库实例在同一台服务器上它会工作正常。
我不想设置网络数据库,TRUSTWORTHY
因为它的一些安全性更宽松,所以我选择了 Aaron 的另一个选项:创建一个用户DatabaseB
,只能访问包含网站应该访问的数据的几个特定视图,然后进入链接服务器对象的安全属性,并设置网站用户在访问链接服务器时以新的受限用户身份登录。
这允许我的网站用户对私有数据库中的特定数据具有有限的访问权限,而无需授予其对任何基础表的访问权限。
你不能让程序 A 运行
execute as owner
orexecute as 'db user tied to security account associated with linked server'
吗?这样调用者的权利就不必转移......或者,您可以在远程服务器上创建一个只能执行您想要的查询的登录名,并向服务器 A 上现有的链接服务器添加一个模拟帐户,让本地 Web 服务器登录名模拟服务器 B 上的新登录名。
我更喜欢用模块签名来解决这类问题:
将过程更改为
execute as owner
并将<LoginName>
能够按预期使用它,而无需授予基础对象。您仍然必须以某种方式处理跨服务器权限,但这使得跨数据库部分变得容易。