我需要通过服务主体从Azure Databricks连接到Azure SQL数据库。尝试搜索论坛,但找不到正确的方法。任何帮助将不胜感激。
尝试使用类似的方法通过JDBC连接使用SQL用户ID和密码,并成功运行。现在研究服务主体方法。
P.S:SP ID和密钥应放在Azure密钥保管库中,并且需要在此处通过Databricks访问。
答案 0 :(得分:0)
也许您可以参考本教程:Configuring AAD Authentication to Azure SQL Databases。
摘要:
Azure SQL是一项出色的服务-您无需管理所有讨厌的服务器内容即可将数据库放入云中。但是,Azure SQL的问题之一是您必须使用SQL身份验证进行身份验证-用户名和密码。但是,您也可以通过Azure Active Directory(AAD)令牌进行身份验证。这类似于使用Windows身份验证的集成登录-但您使用的是AAD,而不是Active Directory。
AAD身份验证有许多优点:
要使其正常工作,您需要:
但是在这篇文章中,作者将逐步创建服务主体,为AAD身份验证配置数据库,创建用于检索令牌的代码以及为AAD身份验证配置EF DbContext。
仍然希望本教程可以对您有所帮助。
答案 1 :(得分:0)
Azure Key Vault与Azure Databricks的支持
https://docs.azuredatabricks.net/user-guide/secrets/secret-scopes.html#akv-ss
答案 2 :(得分:0)
**Here's the working Solution**
sql_url=sqlserver://#SERVER_NAME#.database.windows.net:1433;database=#DATABASE_NAME#
properties = {"user":"#APP_NAME#","password":dbutils.secrets.get(scope =
"#SCOPE_NAME#", key =
"#KEYVAULT_SECRET_NAME#"),"driver":"com.microsoft.sqlserver.jdbc.SQLServerDriver"}
**APP_NAME**==>which is created under app registration in Azure active directory.
**SCOPE_NAME**==>Which you have create mentioned on docs Follow the
URL(https://docs.azuredatabricks.net/user-guide/secrets/secret-scopes.html)
**KEYVAULT_SECRET_NAME**==>Secret Key name which is put into AKV.
**NOTE PROVIDE ACCESS TO YOUR APP_ID ON DATABASE STEPS MENTIONED BELOW**
CREATE USER #APP_NAME# FROM EXTERNAL PROVIDER
EXEC sp_addrolemember 'db_owner', '#APP_NAME#';
答案 3 :(得分:0)
您可以使用 Apache Spark Connector for SQL Server and Azure SQL 您可以在 following Python file
中找到您必须在 Databricks 中执行的操作的示例如您所见,我们没有直接与服务主体连接,而是使用服务主体生成访问令牌,稍后指定连接参数时将使用该令牌:
jdbc_df = spark.read.format("com.microsoft.sqlserver.jdbc.spark") \
.option("url", url) \
.option("dbtable", db_table) \
.option("accessToken", access_token) \
.option("encrypt", "true") \
.option("databaseName", database_name) \
.option("hostNameInCertificate", "*.database.windows.net") \
.load()
但如果你不能或不想使用以前的库,你也可以用 Spark 的原生 Azure-SQL JDBC 连接器做同样的事情:
jdbc_df = spark.read.format("com.microsoft.sqlserver.jdbc.SQLServerDriver")\
.option("url", url) \
.option("dbtable", db_table) \
.option("accessToken", access_token) \
.option("encrypt", "true") \
.option("databaseName", database_name) \
.option("hostNameInCertificate", "*.database.windows.net") \
.load()