You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SPN令牌通过DriverManager连接Azure SQL创建视图时登录失败

问题分析与解决方案

针对你遇到的使用SPN令牌通过DriverManager连接Azure SQL创建视图时登录失败的问题,结合你能通过Spark JDBC正常操作表、用用户名密码能创建视图的情况,主要排查以下几个点:

1. 连接URL缺失关键参数

你当前传给DriverManager的azure_sql_url仅包含服务器地址,缺少数据库名称和必要的SSL连接参数。Spark JDBC在操作时可能隐式携带了这些参数,而DriverManager需要明确指定,否则令牌认证无法关联到目标数据库,导致登录失败。

修复方法:

补全连接URL,加入数据库名、加密配置等参数:

azure_sql_url = "jdbc:sqlserver://xxxxxxx.windows.net;databaseName=testDatabase;encrypt=true;hostNameInCertificate=*.database.windows.net"

2. 连接属性不完整

虽然你设置了accessToken,但DriverManager连接时需要确保SSL配置正确,避免因安全校验不通过触发认证失败。可以把SSL参数补充到Properties中(或直接写在URL里):

properties = spark._sc._gateway.jvm.java.util.Properties()
properties.setProperty("accessToken", access_token)
properties.setProperty("encrypt", "true")
properties.setProperty("hostNameInCertificate", "*.database.windows.net")

3. 确认SPN的视图创建权限

虽然你能操作表,但创建视图需要单独的权限。可以在Azure SQL中执行以下SQL确认并授予权限:

-- 替换为你的SPN名称(格式:<tenant-id>@<spn-id> 或SPN的显示名称)
GRANT CREATE VIEW TO [your-spn-name];

修改后的完整代码示例

import adal

resource_app_id_url = "https://database.windows.net/"
service_principal_id = dbutils.secrets.get(scope = "XX", key = "XXX")
service_principal_secret = dbutils.secrets.get(scope = "XX", key = "spn-XXXX")
tenant_id = dbutils.secrets.get(scope = "XX", key = "xxId")
authority = "https://login.windows.net/" + tenant_id
# 补全URL参数
azure_sql_url = "jdbc:sqlserver://xxxxxxx.windows.net;databaseName=testDatabase;encrypt=true;hostNameInCertificate=*.database.windows.net"

context = adal.AuthenticationContext(authority)
token = context.acquire_token_with_client_credentials(resource_app_id_url, service_principal_id, service_principal_secret)
access_token = token["accessToken"]

# 初始化Properties并设置必要参数
properties = spark._sc._gateway.jvm.java.util.Properties()
properties.setProperty("accessToken", access_token)

# 建立连接并执行视图创建
sql_driver_manager = spark._sc._gateway.jvm.java.sql.DriverManager
sql_con = sql_driver_manager.getConnection(azure_sql_url, properties)

query = """
create or alter view test_view as select * from dbo.test_table
"""
stmt = sql_con.createStatement()
stmt.executeUpdate(query)
stmt.close()
sql_con.close()

额外提示

  • 考虑替换过时的adal库为msal(Microsoft Authentication Library),ADAL已停止维护,MSAL提供更稳定的令牌获取能力。
  • 确保Azure SQL服务器的防火墙规则允许当前环境的IP访问(你能通过Spark连接,此点大概率无问题)。

内容的提问来源于stack exchange,提问作者Ramaraju.d

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 18:15:59