1

当我在 SQL Server 2005 中将模拟与数据库链接结合起来时,我得到了一个奇怪的行为。首先,我使用简单的 SQL Server Authentication with Login 'John'连接到数据库服务器。在此服务器上,定义了服务器链接remote_sqlserver。我已经在此服务器中拥有mydb的 SELECT 权限。当我只是在此服务器链接上查询数据库上的表时:

SELECT count(*)
FROM remote_sqlserver.mydb.dbo.mytable  -- Works!

之后,我尝试使用相同的登录名进行模拟(不要问为什么要这样做,我只是在尝试;))

EXECUTE AS LOGIN = 'John'

SELECT count(*)
FROM remote_sqlserver.mydb.dbo.mytable  -- Error: "Login failed for user: 'John'"

当我恢复时,它再次起作用:

REVERT

SELECT count(*)
FROM remote_sqlserver.mydb.dbo.mytable  -- Works!

你有什么想法,为什么我得到一个模拟错误,虽然相同的登录可以在没有模拟的情况下查询表?

顺便说一句:在“冒充自我”之后,如果我查询本地数据库,(当然,我有足够的权限)我不会收到任何错误。只有当我通过服务器链接查询远程数据库时才会发生这种情况。

4

3 回答 3

2

您应该阅读联机丛书文章“使用 EXECUTE AS 扩展数据库模拟”。

当您使用 EXECUTE AS 访问远程服务器时,必须将远程服务器配置为信任调用者。即使“父”和“子”登录名相同(即“John”),因为您使用的是 EXECUTE AS,但必须建立信任关系。即使登录名相同,身份验证“路径”也不同。

于 2009-12-09T15:36:52.643 回答
2

如果身份验证可以通过信任您所说的人的简单方式进行,那不是很有趣吗?有人会说“我是约翰,把我账户里的所有钱都给我”,银行就会支付现金。现在,幸运的是,到处使用的身份验证系统要求更高一点,当有人出现并说“我是约翰”时,他将面临挑战“你好约翰,所以......你的密码是什么?”。

完全相同的事情发生在这里。您可能会注意到,当您说EXECUTE AS Login = 'John'没有提供密码时。因此,SQL Server 实例可能被“愚弄”了您是“约翰”,但 SQL 之外的任何人都不会相信您(而 SQL 内部的“愚弄”实际上是关于信任和特权的由来已久,真正发生的事情更多比如“我是系统管理员,我说你应该相信这个用户是约翰!”。

如果您想访问 SQL Server 系统之外的任何内容并成为John,那么您需要指定 John 的密码。通常的方法是使用凭证对象,带有CREATE CREDENTIAL.

于 2009-12-09T16:49:27.390 回答
1

如果您还没有,可能值得快速阅读一下EXECUTE AS所有权链,以防它们可以阐明您遇到的问题

于 2009-12-09T16:22:13.020 回答