使用Azure Synapse无服务器SQL池查询Delta表时遇目录列表错误
问题描述
使用Azure Synapse无服务器SQL池,通过Azure Data Studio以SQL管理员凭据登录,执行以下OPENROWSET查询指定Delta表时:
SELECT TOP 100 * FROM OPENROWSET( BULK 'https://(...).dfs.core.windows.net/(...)/table/', FORMAT = 'DELTA' ) AS [result]
触发错误:
Content of directory on path 'https://.../table/_delta_log/*.*' cannot be listed.
仅该table表出现此问题,复制生成的table_copy可正常查询,且原表仅能在Synapse UI内正常访问。已尝试的操作包括:
- 配置IAM权限(Storage Blob Contributor、Storage Blob Owner、Storage Queue Data Contributor及Owner)
- 为Synapse Studio托管标识设置ACL的读、写、执行权限并传播至所有子项
- 恢复文件夹默认权限
- 通过PySpark复制、删除并重写原表
可能的解决方案
- 针对性修复_delta_log目录的ACL权限
即使已设置父目录ACL,原表的_delta_log目录可能存在权限继承异常:
- 为Synapse无服务器SQL池的托管标识(注意是无服务器池自身的标识,而非Synapse Studio标识)单独分配
_delta_log目录的读取+执行权限,同时覆盖默认权限和访问权限 - 用Azure Storage Explorer逐一验证
_delta_log下所有日志文件的权限,确保无孤立权限文件
- 切换至托管标识认证查询
替换当前SQL管理员凭据的认证方式,改用无服务器SQL池的托管标识执行查询:
SELECT TOP 100 * FROM OPENROWSET( BULK 'https://(...).dfs.core.windows.net/(...)/table/', FORMAT = 'DELTA', CREDENTIAL = (IDENTITY = 'Managed Identity') ) AS [result]
确保该托管标识已被授予存储账户的Storage Blob Data Reader权限。
- 修复Delta表日志完整性
原表_delta_log可能存在损坏或权限异常的日志文件:
- 在Synapse Spark池中执行Delta Lake的
VACUUM命令清理无效日志:
from delta.tables import DeltaTable delta_table = DeltaTable.forPath(spark, "abfss://...@....dfs.core.windows.net/.../table/") delta_table.vacuum(0) # 清理所有过期文件,生产环境需谨慎操作
清理完成后再尝试无服务器SQL池查询。
- 检查存储账户网络限制
确认存储账户的防火墙规则未阻断Synapse无服务器SQL池的访问:
- 进入存储账户 -> 网络 -> 防火墙和虚拟网络,确保勾选“允许受信任的Microsoft服务访问此存储账户”
- 若配置了VNet限制,需同步配置Synapse无服务器池的VNet集成,或添加对应IP范围至存储账户白名单
内容的提问来源于stack exchange,提问作者Dinis Rodrigues
相关产品推荐
相关产品推荐

