Azure SQL Database跨数据库是否支持Microsoft Entra?跨库查询报错求助
解决Azure SQL跨数据库查询(Microsoft Entra认证下)的替代方案
一、同一逻辑服务器下:用跨数据库用户替代外部表
如果是同一Azure SQL逻辑服务器内的跨库访问,直接用跨数据库用户比折腾外部表+凭据靠谱:
- 先在目标数据库(要访问的那个库)里创建对应Entra身份的用户:
CREATE USER [你的Entra账户名/组名] FROM EXTERNAL PROVIDER; - 给这个用户分配必要权限,比如只读:
GRANT SELECT ON SCHEMA::[目标表所在架构] TO [你的Entra账户名/组名]; - 回到源数据库,直接用三部分名称查询就行:
注意:这个方法只适用于同一逻辑服务器下的数据库,跨服务器用不了。SELECT * FROM [目标数据库名].[目标架构].[目标表名];
二、托管实例环境:开启跨库查询配置
如果是Azure SQL托管实例(MI)内的跨库访问:
- 先确认服务器级配置
ALLOW_CROSS_DATABASE_QUERIES已开启(默认可能是开的):EXEC sp_configure 'ALLOW_CROSS_DATABASE_QUERIES', 1; RECONFIGURE; - 然后同样给目标库创建Entra身份的用户并授权,直接用三部分名称查询,不需要外部表和凭据。
三、跨服务器场景的替代方案
如果是跨不同逻辑服务器/托管实例,试试下面两种方法:
1. 用Entra服务主体作为凭据身份
之前用MI身份不行的话,换服务主体试试:
- 先在Entra ID里创建一个服务主体,把它加到目标数据库里当用户,给足权限。
- 在源数据库创建数据库范围凭据:
CREATE DATABASE SCOPED CREDENTIAL [SP_Cred] WITH IDENTITY = N'[服务主体的客户端ID]', SECRET = N'[服务主体的密钥]'; - 创建外部数据源关联这个凭据:
CREATE EXTERNAL DATA SOURCE [Remote_Server] WITH ( LOCATION = N'sqlserver://[目标服务器名].database.windows.net', CREDENTIAL = [SP_Cred] ); - 最后创建外部表就能查询了。
2. 用当前Entra身份直接访问外部数据源
如果目标是Azure SQL数据库,可直接用当前连接的Entra身份访问,不用显式凭据:
CREATE EXTERNAL DATA SOURCE [Remote_Server] WITH ( LOCATION = N'sqlserver://[目标服务器名].database.windows.net', CONNECTION_OPTIONS = N'Authentication=Active Directory Integrated' );
创建外部表后,查询时会自动用你当前的Entra身份访问目标库,前提是这个身份在目标库已经有访问权限。
四、顺便排查原方法的问题
如果还想搞明白为啥原凭据方法报错,检查这几点:
- MI身份有没有在目标库被授权:得在目标库创建MI对应的Entra用户(
CREATE USER [MI的Entra身份名] FROM EXTERNAL PROVIDER;),并给权限。 - 外部数据源的LOCATION地址有没有拼写错误,比如服务器名、后缀。
- 你查询时用的身份是不是能使用MI身份:如果是用普通Entra用户连接,而凭据设成MI身份,得确保这个用户有调用MI身份的权限。
内容的提问来源于stack exchange,提问作者Harkrishan
相关产品推荐
相关产品推荐

