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

Azure Synapse:通过托管标识从Notebook连接Azure SQL及其他服务的方案

从Azure Synapse Notebook通过托管标识连接Azure SQL的可选方案

针对你遇到的msssparkutils.credentials.gettoken仅支持特定资源的问题,以下是几个可行的替代方案:

方案1:PyODBC + Azure AD 托管标识直接认证

利用PyODBC的Azure AD内置认证能力,无需手动获取令牌,驱动会自动使用Synapse Notebook的托管标识完成认证:

  1. 确保Notebook环境已安装pyodbc和ODBC驱动(Synapse默认环境通常已预装)
  2. 使用如下连接代码:
import pyodbc

server = 'xxx.database.windows.net'
database = '你的数据库名'
conn_str = f"""
    Driver={{ODBC Driver 18 for SQL Server}};
    Server=tcp:{server},1433;
    Database={database};
    Authentication=ActiveDirectoryMsi;
    Encrypt=yes;
    TrustServerCertificate=no;
"""
conn = pyodbc.connect(conn_str)
# 后续执行SQL操作示例
cursor = conn.cursor()
cursor.execute("SELECT TOP 10 * FROM 你的表名")

方案2:Azure Identity SDK 通用令牌获取

使用Azure Identity Python SDK的DefaultAzureCredential,它会自动识别Synapse的托管标识,支持获取任意Azure服务的令牌(包括Azure SQL):

  1. 安装依赖(若未安装):
%pip install azure-identity
  1. 获取令牌并连接SQL:
from azure.identity import DefaultAzureCredential
import pyodbc

credential = DefaultAzureCredential()
# Azure SQL的资源标识符固定为https://database.windows.net/
token = credential.get_token("https://database.windows.net/")

server = 'xxx.database.windows.net'
database = '你的数据库名'
conn_str = f"""
    Driver={{ODBC Driver 18 for SQL Server}};
    Server=tcp:{server},1433;
    Database={database};
    UID=任意非空字符串;
    PWD={token.token};
    Encrypt=yes;
    TrustServerCertificate=no;
    Authentication=ActiveDirectoryPassword;
"""
conn = pyodbc.connect(conn_str)

注意:此处UID可填任意非空字符串,Authentication指定为ActiveDirectoryPassword,实际通过令牌作为密码完成认证。

方案3:Synapse 链接服务(Linked Service)

使用Synapse原生的链接服务,预先配置好Azure SQL的托管标识认证,在Notebook中直接调用:

  1. 在Synapse Studio中创建Azure SQL数据库链接服务,认证方式选择托管标识,并确保托管标识拥有SQL数据库的对应访问权限(如db_datareader/db_datawriter)
  2. 在Notebook中通过Spark或msssparkutils访问:
# Spark读取示例
df = spark.read \
    .format("com.microsoft.sqlserver.jdbc.spark") \
    .option("url", "jdbc:sqlserver://xxx.database.windows.net:1433;databaseName=你的数据库名;") \
    .option("dbtable", "你的表名") \
    .option("authentication", "ActiveDirectoryMSI") \
    .load()

# 或使用msssparkutils调用已创建的链接服务
df = msssparkutils.notebook.run("你的链接服务名称", {"表名": "你的表名"})

权限前置要求

无论使用哪种方案,都需要确保Synapse工作区的托管标识已被授予Azure SQL数据库的相应权限:

  • 在SQL数据库中执行:CREATE USER [Synapse工作区托管标识名称] FROM EXTERNAL PROVIDER;
  • 分配角色:ALTER ROLE db_datareader ADD MEMBER [Synapse工作区托管标识名称];(根据业务需求调整角色)

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:05:12