【问题标题】:pyodbc - what username/password is passed here?pyodbc - 这里传递了什么用户名/密码?
【发布时间】:2013-08-23 20:53:53
【问题描述】:

我有以下代码:

import pyodbc

cnxn = pyodbc.connect("DRIVER={SQL Server};"
                      +"SERVER=somesqlserver2008.example.com;"
                      +"DATABASE=exampledatabase;")
cursor = cnxn.cursor()
#do stuff...

上面的代码运行得很好。不过,我有理由相信,这段代码实际上是在“在我背后”传递某种形式的凭据(可以这么说)。例如这段代码:

cnxn = pyodbc.connect("DRIVER={SQL Server};"
                      +"SERVER=someOTHERsqlserver2008.example.com;"
                      +"DATABASE=exampledatabase;")
cursor = cnxn.cursor()

返回:

Traceback (most recent call last):
  File "C:\Users\<my username>\Documents\sql_connect_test1.py", line 27, in <module>
    +"SERVER=someOTHERsqlserver2008.example.com;")
Error: ('28000', "[28000] [Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for user '<user name appears here>'. (18456) (SQLDriverConnect); [28000] [Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for user '<user name appears here>'. (18456)")

尽管我没有在第二个连接字符串中指定用户名/密码,但 pyodbc 似乎使用了用户名和密码。如何查明使用的用户名和密码?

【问题讨论】:

    标签: sql-server-2008 pyodbc


    【解决方案1】:

    如果您未指定,它必须为您传递您的 WINDOWS 域凭据。在发生故障的服务器上,您的 Windows 帐户无权访问(或另一台计算机位于不同的、不受信任的域中)。如果这是一种常见情况,您的程序可能不应该依赖 Windows 身份验证 - 不同的域或具有不同权限的不同用户将尝试运行它。您应该考虑使用 SQL 身份验证并将连接字符串放在配置文件中(而不是在代码中)。

    【讨论】:

    • 嗯...我实际上尝试将"UID=&lt;my username&gt;;PWD=&lt;my password&gt;") 添加到第一个连接字符串,但它没有用。当我将它们排除在连接字符串之外时,它工作正常。不知道发生了什么。
    • 您尝试过 UID = Windows 用户名,还是 UID = SQL auth 登录?无论如何,这只是一个总的猜测和建议,我对 pyodbc 的经验为零。他们的文档对此有何评论?
    • 是的,我确实尝试了UID=&lt;windows username&gt;。我不确定您所说的“SQL 身份验证登录”是什么意思。
    • SQL auth login 是您在 SQL Server 中使用CREATE LOGIN(您可能最熟悉的称为sa)创建的登录名,当然也没有指定FROM WINDOWS。使用 Windows 身份验证时会为您传递 Windows 登录信息 - 您不能将名称硬编码到连接字符串中,并且绝对不应该将 Windows 密码放在那里。
    【解决方案2】:

    这是一个相当古老的答案,但在这些方面的现代搜索中排名很高,所以我想我会添加一些到达这里的想法,想知道什么仍然适用。

    Aaron Bertrand 的帖子是一个很好的总结。不久前,当我分享一个我最初为自己编写的实用程序时,我发现了一个类似的问题。当由其他用户运行时,该实用程序将在后台静默失败,因为他们的域帐户无权访问数据库。

    下面是一些用于与 SQL Server 实例通信的简化示例代码。以下代码在运行时提示用户输入密码,这远不是在生产中执行此操作的理想方式,但仍比直接将凭据放入代码中更好。

    db_user_auth = input("Please enter the db password:")
    
    conn_str = "Driver={SQL Server Native Client 11.0}"
    conn_str = f'{conn_str};Server={db_svr_name}'
    conn_str = f'{conn_str};Database={db_name}'
    conn_str = f'{conn_str};UID={db_user_name}'
    conn_str = f'{conn_str};PWD={db_user_auth}'
    
    db_conn = pyodbc.connect(conn_str)
    

    FWIW 我使用非常相似的技术连接到一些旧版 Microsoft Access 数据库。

    【讨论】:

      猜你喜欢
      • 2020-02-15
      • 2018-01-08
      • 2014-05-03
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 2023-03-24
      • 2015-11-12
      • 2018-07-15
      相关资源
      最近更新 更多