You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure SQL Database跨数据库是否支持Microsoft Entra?跨库查询报错求助

解决Azure SQL跨数据库查询(Microsoft Entra认证下)的替代方案

一、同一逻辑服务器下:用跨数据库用户替代外部表

如果是同一Azure SQL逻辑服务器内的跨库访问,直接用跨数据库用户比折腾外部表+凭据靠谱:

  1. 先在目标数据库(要访问的那个库)里创建对应Entra身份的用户:
    CREATE USER [你的Entra账户名/组名] FROM EXTERNAL PROVIDER;
    
  2. 给这个用户分配必要权限,比如只读:
    GRANT SELECT ON SCHEMA::[目标表所在架构] TO [你的Entra账户名/组名];
    
  3. 回到源数据库,直接用三部分名称查询就行:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:10:13