Azure Synapse:通过托管标识从Notebook连接Azure SQL及其他服务的方案
从Azure Synapse Notebook通过托管标识连接Azure SQL的可选方案
针对你遇到的msssparkutils.credentials.gettoken仅支持特定资源的问题,以下是几个可行的替代方案:
方案1:PyODBC + Azure AD 托管标识直接认证
利用PyODBC的Azure AD内置认证能力,无需手动获取令牌,驱动会自动使用Synapse Notebook的托管标识完成认证:
- 确保Notebook环境已安装pyodbc和ODBC驱动(Synapse默认环境通常已预装)
- 使用如下连接代码:
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):
- 安装依赖(若未安装):
%pip install azure-identity
- 获取令牌并连接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中直接调用:
- 在Synapse Studio中创建Azure SQL数据库链接服务,认证方式选择托管标识,并确保托管标识拥有SQL数据库的对应访问权限(如
db_datareader/db_datawriter) - 在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
相关产品推荐
相关产品推荐

