使用服务主体从DataBricks连接到Azure SQL数据库

时间:2019-04-02 16:39:18

标签: azure azure-sql-database azure-databricks service-principal

我需要通过服务主体从Azure Databricks连接到Azure SQL数据库。尝试搜索论坛,但找不到正确的方法。任何帮助将不胜感激。

尝试使用类似的方法通过JDBC连接使用SQL用户ID和密码,并成功运行。现在研究服务主体方法。

P.S:SP ID和密钥应放在Azure密钥保管库中,并且需要在此处通过Databricks访问。

4 个答案:

答案 0 :(得分:0)

也许您可以参考本教程:Configuring AAD Authentication to Azure SQL Databases

摘要

Azure SQL是一项出色的服务-您无需管理所有讨厌的服务器内容即可将数据库放入云中。但是,Azure SQL的问题之一是您必须使用SQL身份验证进行身份验证-用户名和密码。但是,您也可以通过Azure Active Directory(AAD)令牌进行身份验证。这类似于使用Windows身份验证的集成登录-但您使用的是AAD,而不是Active Directory。

AAD身份验证有许多优点:

  1. 您不再需要共享登录名,因为用户使用其AAD凭据登录,因此审核效果更好
  2. 您可以使用AAD组管理对数据库的访问
  3. 您可以通过服务主体启用“应用”登录

要使其正常工作,您需要:

  1. 要在Azure SQL Server上启用AAD身份验证
  2. 服务负责人
  3. 将登录名添加到数据库中,以授予服务主体所需的任何权限
  4. 添加代码以获取用于访问数据库的身份验证令牌

但是在这篇文章中,作者将逐步创建服务主体,为AAD身份验证配置数据库,创建用于检索令牌的代码以及为AAD身份验证配置EF DbContext。

仍然希望本教程可以对您有所帮助。

答案 1 :(得分:0)

答案 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()