如何在Synapse中使用服务主体访问ADL2并解决目录访问报错?
Synapse链接服务ADL2认证问题排查与解决
问题原因
- 链接服务浏览功能与测试连接的权限逻辑差异:
测试连接仅验证服务主体能否访问指定的具体路径,但链接服务的目录浏览功能需要服务主体拥有容器级的列表权限(因为要遍历容器下的目录结构)。你的服务主体只有文件夹级权限,所以浏览时会触发权限校验失败,显示红色叉号。 - OPENROWSET通配符查询的权限要求:
当使用**通配符时,Synapse会先尝试枚举目标路径下的所有子目录和文件,这需要服务主体具备目标路径父级(容器或上级目录)的列表权限。哪怕你指定的路径和测试连接一致,通配符的使用会触发目录枚举操作,而你的服务主体没有这个权限,因此报错。
配置解决方案
方案1:保留文件夹级权限(不提升容器权限)
- 调整OPENROWSET查询,避免使用
**通配符,直接指定具体的文件路径,示例:OPENROWSET( BULK 'https://adl2abc.dfs.core.windows.net/container/some/path/specific-file.parquet', FORMAT = 'PARQUET' ) AS query_result - 链接服务的红色叉号属于预期现象,只要测试连接正常,不影响指定文件的查询操作。
方案2:支持目录浏览与通配符查询
- 给服务主体添加容器级的
Storage Blob Data Contributor角色;或者采用更细粒度的权限配置:- 在容器级别授予
List权限,允许服务主体枚举目录 - 在目标文件夹级别授予
Read权限,允许读取文件内容
- 在容器级别授予
- 也可以创建Azure RBAC自定义角色,仅包含以下必要权限:
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/list/actionMicrosoft.Storage/storageAccounts/blobServices/containers/blobs/read/action
内容的提问来源于stack exchange,提问作者Krumelur
相关产品推荐
相关产品推荐

