1

我有以下代码:

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

4

2 回答 2

2

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

于 2013-08-23T20:57:23.190 回答
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 数据库。

于 2020-12-04T00:45:04.497 回答