使用服务主体从Azure Databricks写入Synapse专用SQL池遇凭证传递错误
排查Credential Passthrough令牌获取失败问题
核心排查方向
- 集群配置细节复核:
确认集群为高级/标准模式(基础模式不支持凭证传递)、Spark版本≥3.0;在集群编辑页,Azure Data Lake Storage Credential Passthrough已勾选,且未勾选Enable single user access(该选项限制单用户,不适用于服务主体场景)。即使之前确认过,也建议重新检查配置后重启集群,确保变更生效。 - 服务主体权限链验证:
服务主体需同时具备:ADLS Gen2存储账户的Storage Blob Data Contributor权限(Databricks读取源数据、写入临时文件都需要);Synapse专用SQL池的db_owner权限,且确认权限是授予目标服务主体而非其他身份。 - 代码写入逻辑检查:
写入Synapse时不能混用其他认证方式(比如硬编码密钥、SAS令牌),否则会覆盖凭证传递逻辑。正确的写入配置示例:
重点确保df.write \ .format("com.databricks.spark.sqldw") \ .option("url", "jdbc:sqlserver://<synapse-workspace>.sql.azuresynapse.net:1433;database=<db-name>;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.sql.azuresynapse.net;loginTimeout=30;") \ .option("dbtable", "<schema>.<table-name>") \ .option("forwardSparkAzureStorageCredentials", "true") \ .option("tempDir", "abfss://<container>@<storage-account>.dfs.core.windows.net/temp") \ .mode("append") \ .save()forwardSparkAzureStorageCredentials设为true,且tempDir指向的ADLS路径服务主体有读写权限。 - 作业运行身份确认:
如果是通过Databricks作业执行代码,需确认作业的运行身份是目标服务主体,而非个人用户——凭证传递基于当前运行身份,身份不匹配会导致令牌获取失败。
额外验证步骤
- 先执行
dbutils.fs.ls("abfss://<container>@<storage-account>.dfs.core.windows.net/"),验证服务主体能否正常访问ADLS Gen2; - 用服务主体登录Synapse Studio,手动执行建表/插入操作,确认
db_owner权限生效。
内容的提问来源于stack exchange,提问作者azuresnowflake1
相关产品推荐
相关产品推荐

