Azure Databricks用Key Vault机密配置JDBC连接Azure SQL登录失败怎么办
问题修复方案
错误原因
当前代码的错误根源是直接将Azure Key Vault中存储的机密名称作为字符串传入了连接配置,没有从Databricks机密作用域中读取对应的实际机密值,导致SQL Server接收到的登录账号为字符串jdbcusername而非真实的数据库用户名,最终触发登录失败报错。
修复步骤
- 使用Databricks内置的
dbutils.secrets.get()方法从指定机密作用域读取机密值,该方法的两个入参分别为机密作用域名称、机密名称。 - 将读取到的真实用户名、密码赋值给properties配置中的对应字段即可。
修正后的完整代码
from pyspark.sql import * import pandas as pd # 读取parquet文件 outerjoindfparquet = spark.read.format('parquet').load('dbfs:/newjouterjoindfparquet.parquet') display(outerjoindfparquet) # 写入Parquet数据到Azure SQL数据库 mountdatabricksjdbcHostname = "sql-ja-dev.database.windows.net" jdbcPort = "1433" jdbcDatabase = "sqldb-ja-dev" # 从机密作用域secretscopeadbr读取真实的账号密码 jdbc_username = dbutils.secrets.get(scope="secretscopeadbr", key="jdbcusername") jdbc_password = dbutils.secrets.get(scope="secretscopeadbr", key="jdbcpassword") properties = { "user": jdbc_username, "password": jdbc_password } url = "jdbc:sqlserver://{0}:{1};database={2}".format(mountdatabricksjdbcHostname, jdbcPort, jdbcDatabase) # 直接使用已读取的DataFrame写入,无需重复读Parquet减少IO开销 filedf1 = DataFrameWriter(outerjoindfparquet) filedf1.jdbc(url=url, table="Fact_SalesOrder", mode="overwrite", properties=properties)
额外校验项
如果修改代码后仍存在报错,可按以下顺序排查:
- 临时运行
print(dbutils.secrets.get(scope="secretscopeadbr", key="jdbcusername"))验证是否能正常读取到用户名(仅用于排查问题,请勿在生产环境打印任何机密信息) - 确认Azure Key Vault中存储的
jdbcusername、jdbcpassword值与Azure SQL的合法登录凭据完全一致 - 确认Databricks工作区的托管身份对Azure Key Vault分配有**机密获取(Get Secret)**的访问权限
- 确认当前Notebook的运行用户拥有
secretscopeadbr机密作用域的访问权限
内容的提问来源于stack exchange,提问作者Regazzi
相关产品推荐
相关产品推荐

