在sql server中从同一台服务器上的另一个数据库实例中选择数据

SP1*_*SP1 6 sql-server-2008 sql-server permissions

我有一个查询如下所示:

select count(*) as Count, datepart(yyyy, [LogDate]) as [Year]
from ViewAssociate..Auth_Log 
where ActionCode = 12
group by datepart(yyyy, [LogDate])
order by [Year]
Run Code Online (Sandbox Code Playgroud)

此查询是基于 ReadAssociate 数据库的存储过程的一部分。它试图从 ViewAssociate 数据库中获取数据。尝试运行存储过程的用户无权访问 ViewAssociate 数据库,因此查询会引发错误。

我的问题是我能否以某种方式修改查询并为其提供用户名密码以运行,以便我可以从 ViewAssociate Db 获取数据。有人建议,Execute As但这似乎不起作用。

execute as login = 'viewassociate' 我收到此错误:

无法作为服务器主体执行,因为主体“viewassociate”不存在,无法模拟此类主体,或者您没有权限。

该 viewassociate 是一个 sql 登录,它属于db_ownerViewAssociate 数据库。

Wor*_*DBA 4

如果您尝试连接的数据库位于不同的实例上,那么我建议您设置一个链接服务器,然后您可以使用它来获取数据。这将允许您显式使用您想要连接的实例上存在的凭据 - 它还使您的查询相对简单,只需调整为使用由四部分组成的名称来引用表。

-- create a linked server
USE [master]  
GO  
EXEC master.dbo.sp_addlinkedserver   
     @server = '.\INSTANCE_NAME',   
     @srvproduct=N'SQL Server' ;  
GO  
-- add a login to the linked server
EXEC master.dbo.sp_addlinkedsrvlogin   
     @rmtsrvname = '.\INSTANCE_NAME',   
     @locallogin = NULL,   
     @useself = N'False',
     @rmtuser = 'user_name_from_other_instance',
     @rmtpassword = 'password_for_remote_user';  
GO 
-- now you can query the server
SELECT *
  FROM [.\INSTANCE_NAME].master.sys.databases;
GO
Run Code Online (Sandbox Code Playgroud)

这些存储过程有更多可用选项,您还可以使用 SQL Server Management Studio 执行相同的操作。我为您提供了以下文档的一些链接:

链接服务器

创建链接服务器

sp_addlinkedserver

sp_addlinkedserverlogin