使用Python通过Active Directory密码连接Azure SQL Server报错求助
解决pyodbc连接Azure SQL Server时的Active Directory密码认证问题
首先,你遇到的这个错误根源很明确:ODBC Driver 13 for SQL Server依赖一个叫Microsoft Online Services Sign-In Assistant的组件来完成Azure AD密码认证,要么这个组件没安装,要么安装出现了损坏。不过更省心的解决方式是直接升级ODBC驱动——从ODBC Driver 17开始,微软移除了这个额外依赖,对Azure AD认证的支持也更稳定完善。
下面是具体的解决步骤和正确的连接方式:
第一步:升级ODBC驱动
卸载你当前的ODBC Driver 13,安装ODBC Driver 17 for SQL Server(或更高版本)。这个驱动无需额外安装Sign-In Assistant组件,就能直接支持Azure AD密码认证。
第二步:修正连接代码
你的代码有几个可以优化的点,同时适配新驱动:
- 驱动名称更新为
{ODBC Driver 17 for SQL Server} - 用f-string拼接连接字符串,避免手动拼接时出现语法错误
- 确保服务器名称是完整的Azure SQL地址(格式:
<ServerName>.database.windows.net) - 添加异常处理,方便排查后续可能出现的问题
修正后的完整代码:
import pyodbc def main(): # 注意:服务器名称必须带上.database.windows.net后缀 serverName = "<ServerName>.database.windows.net" dbName = "<DatabaseName>" # 用户名格式:Azure AD域用户需用user@your-domain.com,内置用户直接用用户名 User_name = '<UserName>' password = '<Password>' driver = '{ODBC Driver 17 for SQL Server}' # 用f-string拼接连接字符串,更清晰易维护 conn_str = f""" DRIVER={driver}; SERVER={serverName}; DATABASE={dbName}; UID={User_name}; PWD={password}; Authentication=ActiveDirectoryPassword """ try: connection = pyodbc.connect(conn_str) cursor = connection.cursor() cursor.execute("select * from dbo.test;") allData = cursor.fetchall() # 遍历输出查询结果 for row in allData: print(row) except pyodbc.Error as e: print(f"操作出错: {e}") finally: # 确保连接最终被关闭 if 'connection' in locals() and connection: connection.close() if __name__ == "__main__": main()
额外注意事项
- 确认你的Azure SQL Server已经启用了Azure AD认证,并且该用户被授予了目标数据库的访问权限(比如db_datareader角色)。
- 检查Azure SQL的防火墙设置:确保你的客户端IP地址被添加到SQL Server的允许列表中,否则会被拒绝连接。
- 用户名格式要准确:如果是Azure AD域用户,必须使用
user@your-domain.com的完整格式;如果是Azure AD内置管理员用户,直接使用用户名即可。
内容的提问来源于stack exchange,提问作者Akshay Godase
相关产品推荐
相关产品推荐

