我在SO上看到与此类似的问题,但似乎没有一个解决我的特定用例的问题。
背景:
我正在运行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;'
但是,当我尝试传递凭据时,连接到Prod / Test服务器时将需要该凭据我收到我的用户名无效的错误。
其中server = '.\SQLEXPRESS'
(我的本地实例)(仍然可以使用信用)
username = '<domain>\<user>'
con_string =
f'DRIVER={driver};SERVER={server};DATABASE{db};UID={username};PWD={password}'
这里是出现问题的地方:
我正在按照以下步骤启动用户名,以逃避反斜杠:
username='domain\\user
如果我运行打印(用户名),我得到:
'domain\user'
如预期
但是,当我运行与以前相同的连接字符串时,这次使用用户名和密码,我从pyodbc收到一条错误消息,内容为:
'domain\\user'
不存在。
为什么SQL Server将变量username
视为包含'domain\\user'
而不是我期望的'domain\user'
。
我已经尽力想尽一切办法在其中添加一个反斜杠,似乎没有任何效果。从将值作为环境变量加载到“原始”字符串,替换等
有趣的是,只要我不打印就得到username
的输出,我就会得到'domain\\user'
更令人困惑的是,为什么SQL Server不会为server
踢回错误,我什至没有在其中转义反斜杠,我只是在传递'。\ SQLEXPRESS'
我非常感谢您对此问题的见解。
任何人都知道python在这里发生什么吗?
在此连接字符串中:
con_string = f'DRIVER={driver};SERVER={server};DATABASE{db};UID={username};PWD={password}'
UID是SQL Auth登录名或数据库用户。不是Windows用户。要使用Windows / AD身份,必须使用trusted_connection=yes
。并以目标用户身份运行该程序,或安装凭据以在NTLM身份验证中使用该用户的凭据。通过使用runas
或runas /netonly
进行EG。