在SQL server 2005中更改上下文(模拟)和使用服务器链接时出现问题

在SQL server 2005中更改上下文(模拟)和使用服务器链接时出现问题,sql,sql-server,sql-server-2005,impersonation,database-link,Sql,Sql Server,Sql Server 2005,Impersonation,Database Link,在SQLServer2005中,当我将模拟与数据库链接结合起来时,会出现一种奇怪的行为。首先,我使用登录名为“John”的简单SQL server身份验证连接到数据库服务器。在此服务器上,定义了服务器链接远程\u sqlserver。我已在此服务器上具有mydb的选择权限。当我简单地查询此服务器链接上DB上的表时: SELECT count(*) FROM remote_sqlserver.mydb.dbo.mytable -- Works! 在那之后,我尝试用相同的登录名进行模拟。不要问为

在SQLServer2005中,当我将模拟与数据库链接结合起来时,会出现一种奇怪的行为。首先,我使用登录名为“John”的简单SQL server身份验证连接到数据库服务器。在此服务器上,定义了服务器链接远程\u sqlserver。我已在此服务器上具有mydb的选择权限。当我简单地查询此服务器链接上DB上的表时:

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!
你知道为什么我在模拟时出错吗?虽然同一个登录名可以在没有模拟的情况下查询表


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

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


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

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


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

如果您还没有登录,则可能值得快速阅读一下,以防他们能够了解您遇到的问题,如果您还没有登录,也许值得快速阅读一下,以防他们能了解到您所遇到的问题

如果身份验证可以通过简单的方式信任您所说的您,这难道不是很有趣吗?有人会说我是约翰,把我账户上的钱都给我,银行就会把钱付清。现在,幸运的是,到处使用的身份验证系统将更加严格,当一个人出现并说我是约翰时,他将受到Hullo John的挑战,所以。。。你的密码是什么

这里也发生了同样的事情。您可能会注意到,当您说executeaslogin='John'时,您没有提供密码。因此,SQL Server实例可能被“愚弄”为您是John,但SQL之外没有人会相信您,而SQL内部的愚弄是一个关于信任和特权的长篇大论事实上,真正发生的事情更像是我是系统管理员,我说您应该相信这个用户是John


如果要访问SQL Server系统之外的任何内容并成为John,则需要指定John的密码。通常的方法是使用凭证对象,使用。

如果身份验证可以通过简单的方式信任你所说的你是谁来工作,那不是很有趣吗?有人会说我是约翰,把我账户上的钱都给我,银行就会把钱付清。现在,幸运的是,到处使用的身份验证系统将更加严格,当一个人出现并说我是约翰时,他将受到Hullo John的挑战,所以。。。你的密码是什么

这里也发生了同样的事情。您可能会注意到,当您说executeaslogin='John'时,您没有提供密码。因此,SQL Server实例可能被“愚弄”为您是John,但SQL之外没有人会相信您,而SQL内部的愚弄是一个关于信任和特权的长篇大论事实上,真正发生的事情更像是我是系统管理员,我说您应该相信这个用户是John


如果要访问SQL Server系统之外的任何内容并成为John,则需要指定John的密码。通常的方法是使用凭证对象,它可能是该用户的默认数据库,这不对吗?我不确定,所以不是正确的答案。对不起,我不明白。你能说得更清楚吗?它可能是该用户的默认数据库,这不对吗?我不确定,所以不是正确的答案。对不起,我不明白。你能说清楚点吗?谢谢你简单的解释。我会读更多关于这方面的内容。然而,在这个特殊的例子中,我已经以John的身份连接到服务器,在我向服务器问好之前,我只想再次告诉你们:我是John。这就是为什么我认为如果我一次又一次地说我是John应该不会造成太多麻烦的原因…当你说“执行为”之前的凭据不再相关时。但是当我在说“执行为”之后查询另一个本地数据库时,我没有得到错误,请参见问题下方的BTW注释。如果你说的是真的,我也不能这么做,对吗?又一次
cal数据库信任为您担保的系统管理员,所以一切都很好。如果您说executeasuser='John',那么您的'idenity'将由dbo而不是sysadmin来证明,整个“扩展数据库模拟上下文”讨论都将适用。但是,既然您说了executeaslogin='John',您的身份在本地SQL Server实例中的任何地方都是好的。谢谢您的简单解释。我会读更多关于这方面的内容。然而,在这个特殊的例子中,我已经以John的身份连接到服务器,在我向服务器问好之前,我只想再次告诉你们:我是John。这就是为什么我认为如果我一次又一次地说我是John应该不会造成太多麻烦的原因…当你说“执行为”之前的凭据不再相关时。但是当我在说“执行为”之后查询另一个本地数据库时,我没有得到错误,请参见问题下方的BTW注释。如果你说的是真的,我也不能这么做,对吗?另一个本地数据库信任为你担保的系统管理员,所以一切都很好。如果您说executeasuser='John',那么您的'idenity'将由dbo而不是sysadmin来证明,整个“扩展数据库模拟上下文”讨论都将适用。但是,既然您说了executeaslogin='John',那么您的身份在本地SQL Server实例中的任何地方都是好的