无法使用 FreeTDS 配置连接到 Azure SQL 实例

Posted

技术标签:

【中文标题】无法使用 FreeTDS 配置连接到 Azure SQL 实例【英文标题】:Can't connect to Azure SQL instance using FreeTDS config 【发布时间】:2021-08-26 21:17:20 【问题描述】:

我可以通过以下方式从我的 Ubuntu 20.04 VM 连接到我的 Azure SQL 数据库:

TDSVER=7.3 tsql -H mysubdomain.database.windows.net -U un -P pw -p 1433

我想用 freetds.conf 让它工作,但它失败了,我不知道为什么;这是我正在尝试的:

tsql -S db_from_conf -U un -P pw

freetds.conf 包含:

[db_from_conf]
    host = mysubdomain.database.windows.net
    port = 1433
    tds version = 7.3

第二次调用失败:

Msg 40532 (severity 20, state 1) from db_from_conf:
    "Cannot open server "db_from_conf" requested by the login.  The login failed."
Error 20002 (severity 9):
    Adaptive Server connection failed
There was a problem connecting to the server

以下是“tsql -C”的结果:

Compile-time settings (established with the "configure" script)
                        Version: freetds v1.1.6
         freetds.conf directory: /etc/freetds
 MS db-lib source compatibility: no
    Sybase binary compatibility: yes
                  Thread safety: yes
                  iconv library: yes
                    TDS version: auto
                          iODBC: no
                       unixodbc: yes
          SSPI "trusted" logins: no
                       Kerberos: yes
                        OpenSSL: no
                         GnuTLS: yes
                           MARS: yes

这些有何不同,我怎样才能让它发挥作用?

【问题讨论】:

不幸的是,没有。问题是 Azure SQL 需要与常规 SQL Server 实例不同的连接参数。 【参考方案1】:

尝试将 freetds.conf 在配置文件中识别的 TDS 版本设置为 7.1 或 8.0。在一些用户中,问题是 freetds.conf 识别的 TDS 版本在较新的版本中发生了变化。请查看 FreeTDS 1.3 版 2021 年 6 月 4 日发布。

注意:如果您的连接字符串使用“SERVERNAME=”,则使用相应 freetds.conf 服务器中的设置。如果您的连接字符串使用“SERVER=”,那么 freetds.conf 和 odbc.ini 都会被忽略。

请记住,您的 freetds.conf 看起来不错,ServerName 是您在 /etc/freetds/freetds.conf 中定义的名称,并且 TDS_Version 应该与您在 /etc/freetds/freetds.conf 中定义的名称相匹配

示例命令:

 tsql -S 'DNS name' -U devuser 

 isql -v DNS Name User 'Password'

首先安装以下软件包:

sudo apt-get install unixodbc unixodbc-dev freetds-dev tdsodbc

并按如下方式配置freetds:

--- /etc/freetds/freetds.conf ---
[TS]
host = SERVER
port = 1433
tds version = 7.0
client charset = UTF-8

如果需要odbc连接,可以如下配置odbcinst.ini:

--- /etc/odbcinst.ini ---
[FreeTDS]
Description = FreeTDS
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
FileUsage = 1
CPTimeout =
CPResuse  =
client charset = utf-8

和odbc.ini如下:

--- /etc/odbc.ini ---
[TS]
Description = "test"
Driver = FreeTDS
Servername = SERVER
Server = SERVER
Port = 1433
Database = DBNAME
Trace = No

使用此命令确认您的实例/服务器配置:

tsql -LH servername

请记住,您只能指定一个实例或一个端口,不能同时指定两者。

确认设置后,使用此命令连接到服务器并打开交互式提示,您可以从中在服务器上运行 SQL 命令:

tsql -S servername -U username -P password

请记住,此用户应在数据库服务器本身上创建并具有访问您的数据库的适当权限。

注意:如果问题仍然存在,在某些情况下,问题是由于配置文件中的缩进引起的。因此,在 /etc/odbc.ini 中,删除所有缩进并重试。

【讨论】:

以上是关于无法使用 FreeTDS 配置连接到 Azure SQL 实例的主要内容,如果未能解决你的问题,请参考以下文章

[S1000][unixODBC][FreeTDS][SQL Server]无法连接到数据源

tsql 实用程序 (FreeTDS) 可以连接到 SQL Server,但 pymssql 不能

尝试从 tsql 连接到 sql-azure 时从服务器读取失败

Azure ADF 管道无法连接到 Azure SQL

php 无法连接到 sql server 2008(使用 pdo dblib)

为啥我的 Azure 应用服务无法使用托管标识连接到 Azure 存储帐户?