我们有一个在 Windows 上运行的 JupyterLab 实例,我们希望按照以下参考连接到 SQL Server 上的数据源:
我们已经在 Windows 上安装了 Microsoft ODBC Driver for SQL Server v18,并且以下 iPython 语句在
.ipynb
文件中完成正常。
import pyodbc
print("Imported pyodgc")
接下来,我们需要构造连接字符串并尝试获得第一个 happy pass 连接。上面的参考提供了以下示例源代码。
# Establish the connection
server = '<server>.database.windows.net'
database = '<database>'
username = '<username>'
password = '<password>'
driver= '{ODBC Driver 18 for SQL Server}'
conn = pyodbc.connect('DRIVER=' + driver + ';SERVER=' +
server + ';PORT=1433;DATABASE=' + database +
';UID=' + username + ';PWD=' + password)
print(conn)
conn.close()
如果使用上面的源码,我们期望得到连接字符串
DRIVER={ODBC Driver 18 for SQL Server};SERVER=<server>.database.windows.net;PORT=1433;DATABASE=<database>;UID=<username>;PWD=<password>
。
但是,在我们的组织中,我们通过用户的 Active Directory 凭据连接到 SQL Server。例如,我们授予用户
DOMAIN\username
访问权限,然后该用户登录Windows并启动SQL Server Management Studio。这样程序就以用户身份运行了DOMAIN\username
。因此,客户端将无需输入用户名和密码即可连接。
我们正在尝试将上述工作方式转化为 Jupyter 环境并使其发挥作用。因此,我们构造了以下连接字符串。
DRIVER={ODBC Driver 18 for SQL Server};SERVER=<server>.database.windows.net;PORT=1433;DATABASE=<database>
但是,我们得到了以下错误。并且,驱动程序似乎将
user
视为空字符串并导致登录失败。
---------------------------------------------------------------------------
InterfaceError Traceback (most recent call last)
Cell In[16], line 1
----> 1 conn = pyodbc.connect(connect_str)
InterfaceError: ('28000', "[28000] [Microsoft][ODBC Driver 18 for SQL Server]
[SQL Server]Login failed for user ''. (18456) (SQLDriverConnect); [28000]
[Microsoft][ODBC Driver 18 for SQL Server][SQL Server]Login failed for user ''. (18456)")
我们想知道是否可以使用运行用户的 Active Directory 凭据从 Jupyter 到 SQL Server 建立连接,以及如何连接。
我们感谢任何提示和建议。
通过以下连接字符串建立工作连接:
DRIVER={ODBC Driver 18 for SQL Server}; SERVER=<server>; DATABASE=<database>; Trusted_Connection=yes
。
所以,感谢@AlwaysLearning,解决方案的关键是
Trusted_Connection
。