SQL Server跨不同SQL身份认证数据库执行内连接的可行性咨询
这个问题我之前碰到过好几次,核心痛点就是你当前的SQL连接只能用一套身份凭据,没法同时拿着两个不同的SQL账号去访问两个数据库。给你三个靠谱的解决办法,按需选就行:
解决方案1:创建链接服务器(Linked Server)——适合长期频繁查询
如果需要经常做这种跨库查询,创建链接服务器是最方便的,相当于给两个库搭个持久化的“桥梁”:
- 首先执行下面的语句创建链接服务器,把占位符换成你自己的信息:
EXEC sp_addlinkedserver @server = N'LinkedDBB', -- 链接服务器的名称,随便取个好记的 @srvproduct=N'', @provider=N'SQLNCLI', @datasrc=N'你的SQL服务器实例名'; -- 比如localhost或者具体的服务器IP/名称 EXEC sp_addlinkedsrvlogin @rmtsrvname=N'LinkedDBB', @useself=N'False', @rmtuser=N'数据库B的SQL用户名', @rmtpassword=N'数据库B的SQL密码';
- 之后就可以像Windows认证时那样写查询,只是把
databaseB换成链接服务器名+库名:
SELECT a.userID, b.usersFirstName, b.usersLastName FROM TableA a INNER JOIN LinkedDBB.databaseB.dbo.TableB b ON a.userID = b.userID;
- 提醒一下:创建链接服务器需要你有
ALTER ANY LINKED SERVER的权限,要是后续不用了记得删掉,避免留安全隐患:
EXEC sp_dropserver 'LinkedDBB', 'droplogins';
解决方案2:使用OPENROWSET函数——适合临时查询
如果只是偶尔查一次,不想搞持久化的链接服务器,用OPENROWSET直接在查询里带连接信息就行:
SELECT a.userID, b.usersFirstName, b.usersLastName FROM TableA a INNER JOIN OPENROWSET( 'SQLNCLI', 'Server=你的SQL服务器实例名;UID=数据库B的SQL用户名;PWD=数据库B的SQL密码;', 'SELECT userID, usersFirstName, usersLastName FROM databaseB.dbo.TableB' ) b ON a.userID = b.userID;
- 注意:这个方法需要先开启
Ad Hoc Distributed Queries配置,执行下面的语句开启:
sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE;
用完之后建议关闭这个配置,减少安全风险:
sp_configure 'Ad Hoc Distributed Queries', 0; RECONFIGURE; sp_configure 'show advanced options', 0; RECONFIGURE;
解决方案3:调整账号权限——如果业务安全允许
要是你的安全政策没那么严格,最简单的办法就是让其中一个账号拥有两个库的访问权限。比如给访问数据库A的SQL账号,授予数据库B中TableB的读取权限:
-- 先切换到数据库B USE databaseB; GO -- 给数据库A的SQL账号授予TableB的查询权限 GRANT SELECT ON dbo.TableB TO '数据库A的SQL用户名'; GO
之后你就可以直接用最开始Windows认证时写的查询语句了,完全不用改:
SELECT a.userID, b.usersFirstName, b.usersLastName FROM TableA a INNER JOIN databaseB.dbo.TableB b ON a.userID = b.userID;
内容的提问来源于stack exchange,提问作者Tym
相关产品推荐
相关产品推荐

