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

Azure SQL数据库间托管身份跨库查询问题求助

跨Azure SQL数据库(托管身份认证)合并数据集解决方案

问题核心

Azure SQL弹性查询的RDBMS类型外部数据源暂不支持直接使用托管身份(系统/用户分配)作为跨库认证凭据,你遇到的Msg 33047错误正是因为该场景未被支持(IDENTITY = 'Managed Identity'仅适用于Azure存储等非RDBMS数据源)。

以下是兼容中国区的可行方案:


方案1:Azure Data Factory(ADF)数据同步/合并(推荐中国区)

ADF完全支持托管身份访问Azure SQL,且中国区部署的ADF与Azure SQL集成稳定:

  • 给ADF的系统托管身份授予两个数据库的对应权限:源库分配db_datareader,目标库按需分配db_datareader/db_datawriter
  • 创建复制活动或数据流,将源库数据同步至目标库的中间表,之后直接在目标库查询合并后的数据
  • 可配置定时触发器实现自动同步,或按需手动运行任务

方案2:Azure AD服务主体替代(兼容中国区)

系统托管身份本质是特殊的Azure AD服务主体,可通过服务主体密钥实现弹性查询认证:

  1. 在Azure门户获取系统托管身份的客户端ID和密钥(在身份页生成客户端密钥)
  2. 在目标数据库创建该服务主体的外部用户并授权:
CREATE USER [托管身份客户端ID] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [托管身份客户端ID];
  1. 在源数据库创建凭据和外部数据源:
CREATE DATABASE SCOPED CREDENTIAL RemoteCredential WITH
    IDENTITY = '<托管身份客户端ID>',
    SECRET = '<托管身份客户端密钥>'

CREATE EXTERNAL DATA SOURCE RemoteDatabase WITH (
    Location = '<远程服务器URL>',
    DATABASE_NAME = '<远程数据库名>',
    CREDENTIAL = RemoteCredential,
    TYPE = RDBMS
)

CREATE EXTERNAL TABLE [dbo].[RemoteTable] (
    -- 与源表一致的结构定义
)
  1. 执行跨库查询:
SELECT TOP(1) * FROM [RemoteTable]

方案3:临时Azure AD令牌(临时查询场景)

通过托管身份获取目标数据库的Azure AD访问令牌,创建临时凭据实现查询:

  1. 调用Azure AD API获取令牌(有效期1小时),可通过PowerShell实现:
$token = (Get-AzAccessToken -ResourceUrl https://database.chinacloudapi.cn).Token # 中国区资源地址
  1. 在源数据库创建临时凭据和外部数据源:
CREATE DATABASE SCOPED CREDENTIAL TempRemoteCredential WITH
    IDENTITY = '<托管身份客户端ID>',
    SECRET = '<获取的Azure AD令牌>'

CREATE EXTERNAL DATA SOURCE RemoteDatabase WITH (
    Location = '<远程服务器URL>',
    DATABASE_NAME = '<远程数据库名>',
    CREDENTIAL = TempRemoteCredential,
    TYPE = RDBMS
)
  1. 完成跨库查询后,可删除临时凭据避免过期失效问题:
DROP DATABASE SCOPED CREDENTIAL TempRemoteCredential;

全球区专属方案:链接服务器(中国区暂不支持)

全球区Azure SQL支持用托管身份配置链接服务器:

-- 创建链接服务器
EXEC sp_addlinkedserver
    @server = N'RemoteServer',
    @srvproduct=N'',
    @provider=N'SQLNCLI',
    @datasrc=N'<远程服务器名>.database.windows.net',
    @catalog=N'<远程数据库名>';

-- 配置托管身份登录
EXEC sp_addlinkedsrvlogin
    @rmtsrvname=N'RemoteServer',
    @useself=N'FALSE',
    @locallogin=NULL,
    @rmtuser=N'<托管身份客户端ID>',
    @rmtpassword=N'';

-- 跨库查询示例
SELECT TOP 1 * FROM [RemoteServer].[远程数据库名].[dbo].[RemoteTable]

内容的提问来源于stack exchange,提问作者DeveloperExceptionError

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:25:50