如何在不更改用户名的情况下绕过 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"

一个问题是&lt;servername&gt;.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))。

我还尝试在用户名条目中排除 @&lt;servername&gt;.database.windows.net 部分,但收到以下错误:

msgno 40532: "Cannot open server "1433D" requested by the login. The login failed."

根据https://github.com/pymssql/pymssql/issues/330,@&lt;servername&gt; 部分是由服务器请求的。

所以在这一点上,我尝试执行以下操作:

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 方法,该方法将覆盖此字符限制,或者在仅在 &lt;username&gt; 上调用 dbsetlname 而不使用 @&lt;servername&gt; 部分后做一些事情以将服务器附加到后端的用户名。有没有人有任何建议(同样的偏好是不要求客户更改我们的用户名,但如果没有其他选择,我们可能不得不求助或尝试使用 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 内的图像按钮

如何在不更改浏览器历史记录的情况下更改 url

如何在不更改输入内容的情况下更改输入值

Rails - 如何在不更改页面和更新视图的情况下提交表单?

如何在不重绘图表的情况下刷新 jqplot 条形图