pyodbc - 这里传递了什么用户名/密码?

时间:2013-08-23 20:53:54

标签: sql-server-2008 pyodbc

我有以下代码:

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使用了用户名和密码。如何找出使用的用户名和密码?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

这是一个很老的答案,但是按照这些思路在现代搜索中排名很高,所以我想我会添加一些想法,想知道还有什么想法。

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数据库。