如何在不更改用户名的情况下绕过 pymssql 中 LOGINREC 的名称太长
Posted
技术标签:
【中文标题】如何在不更改用户名的情况下绕过 pymssql 中 LOGINREC 的名称太长【英文标题】:How can I get around Name too long for LOGINREC in pymssql without changing the username 【发布时间】:2017-03-06 20:00:32 【问题描述】:我正在尝试使用 pymssql 连接到客户端的数据库,但至今未能成功。我相信问题的根源是我的 TDSDUMP 的堆栈跟踪中的这个条目:
dblib.c:761:dbsetlname(0x1ac3e10, <username>@<servername>.database.windows.net, 2)
dblib.c:7929:dbperror((nil), 20042, 0)
dblib.c:7981:20042: "Name too long for LOGINREC field"
一个问题是<servername>.database.windows.net
已经超过了字符串限制(根据这个似乎是30:How to use php's dblib PDO driver with long usernames? / SQLSTATE[HY000] Name too long for LOGINREC field (severity 2))。
我还尝试在用户名条目中排除 @<servername>.database.windows.net
部分,但收到以下错误:
msgno 40532: "Cannot open server "1433D" requested by the login. The login failed."
根据https://github.com/pymssql/pymssql/issues/330,@<servername>
部分是由服务器请求的。
所以在这一点上,我尝试执行以下操作:
user = username + "@".format(server)
user = user[:30]
我收到了以下信息(这是一个轻微的改进,但仍然不理想,因为我仍然无法建立连接):
"Cannot open server "<server_name minus the last 6 characters>" requested by the login. The login failed."
如果可能的话,我宁愿将一些参数传递给 pymssql 的 connect 方法,该方法将覆盖此字符限制,或者在仅在 <username>
上调用 dbsetlname 而不使用 @<servername>
部分后做一些事情以将服务器附加到后端的用户名。有没有人有任何建议(同样的偏好是不要求客户更改我们的用户名,但如果没有其他选择,我们可能不得不求助或尝试使用 pyodbc)。
以下是我尝试过的几种连接方式:
conn = pymssql.connect(
host=host,
database=database,
user=username,
password=password,
port=int(port) # this is 1433
)
conn = pymssql.connect(
host=host,
database=database,
user=username + '@'.format(servername),
password=password,
port=int(port) # this is 1433
)
conn = pymssql.connect(
server=<servername>.database.windows.net,
database=database,
user=username,
password=password,
port=int(port) # this is 1433
)
提前感谢您提供的任何帮助/建议!
【问题讨论】:
您能否包含您用于连接的pymssql.connect()
方法?
按要求添加!
呵呵,我从没见过 SQL Server 需要这个。我不确定您是否需要特定于 SQL Server 的东西;也许尝试使用 FreeTDS 的 pyodbc 而不是使用 FreeTDS 的 pymssql?这就是我使用的堆栈,现在微软正式支持它。
“pymssql 会施加长度限制似乎很奇怪” - This comment on GitHub 暗示这可能是由于 pymssql 用于处理 FreeTDS 的特定 API。
根据微软的博客文章,他们将在 SQL Server 中支持 pyodbc 和 django-pyodbc-azure。我仍然使用带有 pyodbc 的 FreeTDS,它的表现非常好。
【参考方案1】:
您或许可以使用另一种连接字符串的方法。
如果您使用的是 SQL Server 身份验证,请尝试以下操作:
conn = pymssql.connect(
server="<servername>.database.windows.net",
port=1433,
user="username",
password="password",
database="dbname"
)
如果您使用的是 Windows 身份验证:
conn = pymssql.connect(
server="<servername>.database.windows.net",
port=1433,
user="DOMAIN\USERNAME",
password="password",
database="dbname"
)
您是否尝试过这两种连接方法?
【讨论】:
嘿,我很欣赏这个建议,但实际上我在提交这个问题后不久就已经尝试过了。不幸的是,它仍然返回了 1433D。以上是关于如何在不更改用户名的情况下绕过 pymssql 中 LOGINREC 的名称太长的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用标签的情况下更改 tableviewCell 内的图像按钮