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

