使用pyodbc连接Synapse Sql失败:Azure函数托管身份登录超时问题
Azure函数托管身份连接Synapse SQL超时问题排查
你的代码里用ActiveDirectoryIntegrated认证方式不对,这是导致超时的核心原因之一,结合托管身份场景,按下面的步骤排查修正:
1. 替换认证方式
Azure函数的托管身份(系统/用户分配)要改用ActiveDirectoryDefault(推荐,适配新版驱动)或ActiveDirectoryMSI(旧版驱动),不要用ActiveDirectoryIntegrated(这个是针对本地AD集成场景的)。修正后的代码示例:
def fun(): # 必须填完整的Synapse服务器FQDN,格式:xxx.sql.azuresynapse.net server = 'servername.sql.azuresynapse.net' db_name = 'dbname' conn_str = ( 'DRIVER={ODBC Driver 17 for SQL Server};' f'SERVER={server};' 'Authentication=ActiveDirectoryDefault;' f'DATABASE={db_name};' ) conn = pyodbc.connect(conn_str) # timeout单位是秒,3000秒太离谱,改成30秒即可 conn.timeout = 30 return conn
2. 配置托管身份权限
- 给Azure函数的托管身份在Synapse SQL中添加登录权限:在Synapse Studio的管理 > SQL池 > 权限里,添加托管身份为登录用户,然后映射到目标数据库的用户,分配必要的角色(比如
db_datareader、db_datawriter) - 如果是无服务器SQL池,需要在数据库中执行创建用户的脚本:
CREATE USER [你的函数托管身份名称] FROM EXTERNAL PROVIDER; ALTER ROLE db_datareader ADD MEMBER [你的函数托管身份名称];
3. 检查网络规则
- 如果Synapse SQL开启了VNet防火墙,要把Azure函数所在的VNet加入Synapse的允许列表;或者临时开启“允许Azure服务和资源访问此服务器”选项测试
- 确认Azure函数的出站规则没有阻断1433端口(SQL默认端口)
4. 验证驱动环境
优先使用ODBC Driver 18 for SQL Server,比17版对托管身份的支持更稳定。如果是用Azure函数的Python环境,确保部署时包含了对应的驱动依赖(Linux环境需要提前安装驱动包)
内容的提问来源于stack exchange,提问作者Vin
相关产品推荐
相关产品推荐

