繁体   English   中英

使用“ActiveDirectoryPassword”身份验证和 pyodbc 连接到无服务器 Azure Synapse SQL 池时收到“登录超时已过期”

[英]Receiving `Login timeout expired` when connecting to a serverless Azure Synapse SQL pool using `ActiveDirectoryPassword` authentication and pyodbc

我正在尝试使用 pyodbc 在 Python 的无服务器 SQL 池上运行 Azure Synapse 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 Workspace 和 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\').\nError code 0xA190; state 41360\n{"ver":"1.0","account_type":"Unknown","cloud_instance_name":"microsoftonline.com","cloud_audience_urn":"urn:federation:MicrosoftOnline"}\nUnknown account type. (0) (SQLDriverConnect)')

超时错误通常是因为服务器没有响应。

  • 您可以尝试在连接字符串中延长连接超时时间的两种解决方案。 -- 默认值为 30 秒。 -- 值为 0 表示无限期等待并且永远不会超时。
  • 尝试将 ODBC 驱动程序版本降级到 17 或 13。

或者解决方法是使用ActiveDirectoryInteractive

import pyodbc

server =  '<servername>'
database =  '<database name>'
username =  '<loginId>'
password =  '<password>'
driver=  '{ODBC Driver 18 for SQL Server}'
Authentication='ActiveDirectoryInteractive'

cnxn = pyodbc.connect(
'DRIVER='+driver+
';PORT=1433;SERVER='+server+
';PORT=1443;DATABASE='+database+
';UID='+username+
';Authentication='+Authentication)

cursor = cnxn.cursor()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM