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

Azure Synapse私有容器下存储过程执行失败问题求助

问题描述
  • 在Azure Synapse开发脚本中创建了用于读取指定文件夹下所有Parquet文件的存储过程,执行成功
  • 在无服务器SQL池数据库中手动创建同功能VIEW,执行成功
  • 存储数据的ADLS Gen2容器为私有访问级别,当前用户拥有Storage Blob Data Contributor权限
  • Synapse管道可通过Copy Data活动将Parquet文件导入该容器
  • 但管道执行存储过程/调用视图时出现错误:

    {"errorCode": "2402", "message": "Execution fail against sql server. Please contact SQL Server team if you need further support. Sql error number: 13807. Error Message: Content of directory on path 'https://xxx.blob.core.windows.net/data/folder/*.parquet' cannot be listed."}

  • 容器切换为公共访问后一切正常,但需保持私有访问级别
解决方案

1. 为Synapse工作区托管身份配置存储权限

管道执行无服务器SQL池操作时,默认使用Synapse工作区的托管身份,而非你的个人用户身份。需要给该托管身份分配目标容器的Storage Blob Data Contributor权限:

  • 进入Azure门户的存储账户,找到目标容器的「访问控制(IAM)」
  • 添加角色分配:角色选Storage Blob Data Contributor,成员类型选「托管身份」,然后选择你的Synapse工作区托管身份,完成分配

2. 配置无服务器SQL池的外部数据源与凭据

如果你的VIEW/存储过程使用OPENROWSET读取Parquet文件,需要确保使用托管身份进行身份验证:

  • 在无服务器SQL池数据库中创建范围凭据(使用托管身份):
    CREATE DATABASE SCOPED CREDENTIAL SynapseManagedIdentity
    WITH IDENTITY = 'Managed Identity';
    
  • 创建外部数据源,关联凭据并指向ADLS Gen2容器:
    CREATE EXTERNAL DATA SOURCE ADLSGen2DataSource
    WITH (
        LOCATION = 'https://xxx.blob.core.windows.net/data',
        CREDENTIAL = SynapseManagedIdentity
    );
    
  • 修改VIEW/存储过程中的OPENROWSET语句,使用该外部数据源:
    CREATE VIEW YourParquetView AS
    SELECT *
    FROM OPENROWSET(
        BULK 'folder/*.parquet',
        DATA_SOURCE = 'ADLSGen2DataSource',
        FORMAT = 'PARQUET'
    ) AS [result];
    

3. 验证管道活动的身份配置

如果管道中使用的是「SQL脚本」活动执行存储过程,确保活动的「连接」配置中,身份验证方式选择「托管身份」(而非SQL身份验证或你的个人AD身份),这样管道会用Synapse托管身份执行SQL操作,匹配我们配置的权限。

关键原因

手动执行时用的是你个人的Storage Blob Data Contributor权限,而管道执行无服务器SQL操作时,默认使用Synapse工作区托管身份,该身份默认没有存储容器的访问权限,导致无法列出目录内容。公共容器下匿名访问允许列出目录,所以报错消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:45:33