【问题标题】:FreeTDS TSQL not working with freetds.confFreeTDS TSQL 不适用于 freetds.conf
【发布时间】:2018-11-07 20:17:06
【问题描述】:

我正在使用 HomeBrew 的 freetds 版本 1.00.91。当我绕过freetds.conf 时,我可以成功连接,例如使用以下命令

tsql -H {my_hostname} -p {port_no} -U {username} -P {password}

但是,当我尝试

tsql -S MYMSSERVER -U {username} -P {password}

失败并出现以下错误:

来自 MYSERVER 的消息 40532(严重性 20,状态 1):
无法打开登录请求的服务器“MYSERVER”。登录失败。

错误 20002(严重性 9):
Adaptive Server 连接失败
连接服务器时出现问题

freetds.conf 内容如下:

[MYSERVER]
        host = {my_hostname}
        port = {port_no}
        tds version = 7.3

我检查了tsql -C 的输出并确认7.3 也是-H -p 命令使用的版本。

以下是来自freetds.log 文件的有关此错误的一些相关信息:

15:49:43.391174 3380 (token.c:313):looking for login token, got  aa(ERROR)
15:49:43.391215 3380 (token.c:132):tds_process_default_tokens() marker is aa(ERROR)
15:49:43.391240 3380 (mem.c:653):tds_free_all_results()
15:49:43.391258 3380 (token.c:2384):tds_process_info() reading message 40532 from server
15:49:43.391308 3380 (token.c:2456):tds_process_info() calling client msg handler
15:49:43.391391 3380 (token.c:2473):tds_process_info() returning TDS_SUCCESS
15:49:43.391418 3380 (token.c:313):looking for login token, got  fd(DONE)
15:49:43.391442 3380 (token.c:132):tds_process_default_tokens() marker is fd(DONE)
15:49:43.391471 3380 (token.c:2082):tds_process_end: more_results = 0

感谢所有帮助!

【问题讨论】:

  • 当您输入tsql -C 时,freetds.conf directory 是否与您拥有的位置 freetds.conf 匹配?
  • @FlipperPA 是的。它确实匹配

标签: tsql freetds


【解决方案1】:

这里有点混乱。 tsql 直接使用 libTDS,所以 freetds.conf 而 isql 是一个 ODBC 程序,主要使用 odbc.ini(在 Windows 上这是作为注册表项存储的)。 isql 不需要部分名称,术语是 DSN 名称。 没有 server_url,名称通常是主机名,如 DNS 名称。 可用于调试这些问题的环境是TDSDUMPCONFIG。 最初问题中的 freetds.conf 似乎是正确的,服务器返回 aa 消息 (ERROR) 的事实似乎表明存在 TCP 连接。 根据https://docs.microsoft.com/en-us/azure/sql-database/sql-database-develop-error-messages 错误40532Cannot open server "%.*ls" requested by the login. The login failed

【讨论】:

  • 谢谢!我改变了一些术语,希望能澄清困惑!
【解决方案2】:

我让它工作,更具体地说,它最终以一种 hacky 方式与 unixODBC 一起工作。

这是我的 freetds.conf 文件

[my_hostname]
        host = {my_hostname}
        port = {port_no}
        tds version = 7.3

以下是我的odbc.ini文件

[Foo]
Description         = Test to SQLServer
Driver              = FreeTDS
Servername          = {the_same_my_hostname_as_in_freetds.conf}
Database            = BingMigration

isql Foo {username} {password} 然后就像一个魅力。

为什么会这样:

根据tsql man,如果在freetds.conf 中找不到服务器名,tsql 会将-S 值视为主机名。这就是上述freetds.conf 起作用的原因。我需要使用my_hostname 命名freetds.conf 部分,因为isql 似乎需要一个与freetds.conf 中第一个参数中的部分匹配的DSN。当我尝试时,简单地使用在 freetds.conf 中没有相应部分的主机名失败了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 2012-10-15
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多