能否在Azure Databricks中对Azure SQL DB/Synapse实现类似ADLS的直通认证?
实现Databricks Notebook无显式账号密码访问Azure SQL DB/Synapse
可以实现,主要有以下几种无需显式指定AD用户名和密码的方式:
1. 利用Azure AD直通认证(和ADLS直通逻辑一致)
- 前提:你的Databricks集群已经开启了Azure AD直通认证配置
- 连接时使用
ActiveDirectoryIntegrated认证模式,示例代码:
jdbc_url = "jdbc:sqlserver://<你的服务器名>.database.windows.net:1433;database=<数据库名>;authentication=ActiveDirectoryIntegrated;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;" df = spark.read.jdbc(url=jdbc_url, table="<目标表名>")
- 注意:需要确保集群节点对应的身份(或当前登录Databricks的AD用户)已被授予Azure SQL DB/Synapse的访问权限(比如
db_datareader角色)
2. 使用Databricks工作区托管身份
- 步骤:
- 在Azure SQL DB/Synapse中,给Databricks工作区的系统托管身份分配数据库访问权限(比如数据读写权限)
- 连接时使用
ActiveDirectoryMSI认证模式,示例代码:
jdbc_url = "jdbc:sqlserver://<你的服务器名>.database.windows.net:1433;database=<数据库名>;authentication=ActiveDirectoryMSI;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;" df = spark.read.jdbc(url=jdbc_url, table="<目标表名>")
- 优势:无需依赖个人AD身份,适合自动化运行的Notebook或作业
3. 使用Azure AD服务主体(生产环境推荐)
- 步骤:
- 在Azure AD中注册一个服务主体,给它分配Azure SQL DB/Synapse的访问权限
- 将服务主体的客户端ID、租户ID、密钥存储到Databricks的Secret Scope中
- 连接时使用
ActiveDirectoryServicePrincipal模式,示例代码:
tenant_id = dbutils.secrets.get(scope="<你的密钥范围>", key="tenant-id") client_id = dbutils.secrets.get(scope="<你的密钥范围>", key="client-id") client_secret = dbutils.secrets.get(scope="<你的密钥范围>", key="client-secret") jdbc_url = f"jdbc:sqlserver://<你的服务器名>.database.windows.net:1433;database=<数据库名>;authentication=ActiveDirectoryServicePrincipal;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;" df = spark.read.jdbc(url=jdbc_url, table="<目标表名>", properties={"user": client_id, "password": client_secret})
- 注意:密钥通过Secret Scope读取,避免硬编码,安全性更高
内容的提问来源于stack exchange,提问作者azuresnowflake1
相关产品推荐
相关产品推荐

