使用pyodbc+ActiveDirectoryPassword连接无服务器Azure Synapse SQL池时遇登录超时
使用pyodbc连接无服务器Azure Synapse SQL池的AD认证失败问题
问题描述
尝试通过Python的pyodbc库对无服务器Azure Synapse SQL池执行SQL查询,采用Azure Active Directory用户认证,代码如下:
import pyodbc driver = '{ODBC Driver 18 for SQL Server}' server = '<server>' db = '<db>' username = '<user>@<domain>@<synapse-workspace>' password = '<password>' with pyodbc.connect( f'Driver={driver};Server=tcp:{server},1433;Database={db};Uid={username};Pwd={password};Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;Authentication=ActiveDirectoryPassword;') as conn: cursor = conn.cursor() cursor.execute('SELECT TOP 100 * from foo') row = cursor.fetchone() while row: print(row) row = cursor.fetchone()
运行后首次报错:
pyodbc.OperationalError: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 18 for SQL Server]Login timeout expired (0) (SQLDriverConnect)')
用户反馈:相同的用户名和密码可以正常登录Synapse工作区和Azure Data Studio,但代码无法连接。
更新:延长超时后的错误
延长连接超时时间后,收到新错误:
pyodbc.Error: ('FA004', '[FA004] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Failed to authenticate the user '<user>@<domain>@<synapse-workspace>' in Active Directory (Authentication option is 'ActiveDirectoryPassword'). Error code 0xA190; state 41360 {"ver":"1.0","account_type":"Unknown","cloud_instance_name":"microsoftonline.com","cloud_audience_urn":"urn:federation:MicrosoftOnline"} Unknown account type. (0) (SQLDriverConnect)')
解决方法
- 修正用户名格式:当前用户名
<user>@<domain>@<synapse-workspace>是错误的。Azure AD用户的正确格式为<user>@<domain>(即企业邮箱账号),不需要追加@<synapse-workspace>后缀——该后缀仅适用于Synapse的本地SQL管理员账号,不适用于AD用户。 - 统一ODBC驱动版本:错误信息中同时出现了ODBC Driver 18和17,需确保代码中指定的驱动版本与系统已安装的版本一致。建议统一使用
{ODBC Driver 18 for SQL Server},并确认该版本已正确安装。 - 核对连接字符串参数:
Server参数需填写无服务器SQL池的正确终结点,格式通常为<workspace-name>-ondemand.sql.azuresynapse.net- 确认
Authentication=ActiveDirectoryPassword参数拼写正确,无遗漏或错误 - 无服务器池的
Database参数可填写master(默认数据库)或目标业务数据库
- 排查网络与防火墙:
- 确认运行代码的环境能访问1433端口,本地环境需在Synapse工作区的防火墙设置中添加客户端IP白名单
- 检查是否有代理、防火墙拦截了ODBC连接请求
内容的提问来源于stack exchange,提问作者alexlod
相关产品推荐
相关产品推荐

