背景:我正在运行Windows 10 Enterprise,使用Jupyter Notebook与SQL Server实例进行连接。
我正在运行Windows 10 Enterprise,使用Jupyter Notebook与Pyodbc连接到SQL Server实例。
我可以成功连接到 trusted_connection=yes
哪儿 server = '.\SQLEXPRESS'
(我本地的例子)
con_string = f'DRIVER={driver};SERVER={server};DATABASE={db};trusted_connection=yes;'
然而,当我试图传入凭证时,我将需要连接到ProdTest服务器,我得到一个错误,我的用户名是无效的。
其中 server = '.\SQLEXPRESS'
(我的本地实例)(应该还可以用creds)
`username = '<domain>\<user>'`
con_string = `f'DRIVER={driver};SERVER={server};DATABASE{db};UID={username};PWD={password}'
问题就出在这里。我按照下面的方式输入用户名,以避免反斜杠。
username='domain\\user'
如果我运行一个 print(username)
,我得到 'domain\user'
正如预期的那样。
然而,当我运行与之前相同的连接字符串,这次使用用户名和密码时,我从pyodbc得到一个错误信息,说:"'domain\user'不存在。
'domain/user'不存在。
为什么SQL Server将变量 username
含有 'domain\\user'
而非 'domain\user'
我所期待的。
我已经尝试了所有我能想到的方法来获得一个反斜杠,但似乎都没有用。从将值作为环境变量加载到 "原始 "字符串中,到替换,等等
有趣的是,每当我只得到 username
也就是没有打印,我得到的是 'domain\\user'
更让人困惑的是,为什么SQL Server不回传错误的 server
我连反斜杠都没有转义,我只是简单地传递'.\SQLEXPRESS'。
我很感激对这个问题的任何见解。
在这个连接字符串中。
con_string = f'DRIVER={driver};SERVER={server};DATABASE{db};UID={username};PWD={password}'
UID是一个SQL Auth登录或数据库用户。 不是Windows用户。 要使用WindowsAD身份,你必须使用 trusted_connection=yes
. 并以目标用户的身份运行程序,或者安装一个凭证,在NTLM认证中使用该用户的凭证。 或者在运行程序时使用 runas
或 runas /netonly
.