Databricks PySpark连接Azure SQL DB报错:身份验证值无效
解决Databricks通过PySpark连接Azure SQL DB的认证错误
1. 修正JDBC认证参数
你当前使用的ActiveDirectoryManagedIdentity并非sqljdbc 12.2版本支持的有效值,该版本中Azure托管标识的正确认证参数为ActiveDirectoryMSI。修改后的connectionProperties如下:
connectionProperties={ "authentication":"ActiveDirectoryMSI", "driver" : "com.microsoft.sqlserver.jdbc.SQLServerDriver" }
2. 确认托管标识权限
- 确保Databricks集群使用的托管标识(系统分配或用户分配)已被添加为Azure SQL DB的数据库用户,并授予对应数据访问权限(如
db_datareader用于读取数据)。 - 可通过Azure SQL查询编辑器执行以下语句完成授权:
CREATE USER [你的托管标识名称] FROM EXTERNAL PROVIDER; ALTER ROLE db_datareader ADD MEMBER [你的托管标识名称];
3. 适配用户分配托管标识的URL配置
若使用用户分配的托管标识,需要在JDBC URL中额外指定msiClientId参数:
jdbcUrl = "jdbc:sqlserver://{0}:{1};database={2};msiClientId=你的MSI客户端ID".format(jdbcHostname, jdbcPort, jdbcDatabase)
4. 其他可选认证方案(若MSI仍失败)
方式一:Active Directory服务主体认证
connectionProperties={ "authentication":"ActiveDirectoryServicePrincipal", "user":"你的服务主体客户端ID", "password":"你的服务主体密钥", "driver" : "com.microsoft.sqlserver.jdbc.SQLServerDriver" }
需提前将服务主体添加为Azure SQL DB用户并授予对应权限。
方式二:Databricks Secrets存储凭证(避免硬编码)
将服务主体密钥或SQL账号密码存入Databricks密钥管理器,再通过代码调用:
secrets_scope = "你的密钥范围名称" client_id = dbutils.secrets.get(scope=secrets_scope, key="sp-client-id") client_secret = dbutils.secrets.get(scope=secrets_scope, key="sp-client-secret") connectionProperties={ "authentication":"ActiveDirectoryServicePrincipal", "user":client_id, "password":client_secret, "driver" : "com.microsoft.sqlserver.jdbc.SQLServerDriver" }
5. 验证驱动部署状态
确认Databricks集群的"库"页面已成功加载sqljdbc_12.2.0.0_enu版本的JAR包,避免因驱动缺失导致连接失败。
内容的提问来源于stack exchange,提问作者Developer Rajinikanth
相关产品推荐
相关产品推荐

