无法使用ISQL

时间:2016-02-11 15:05:23

标签: centos odbc isql

StackExchange上的第一篇文章 - 请放心:)

我在Centos 6中设置了ODBC,以便从我的Asterisk安装中执行ms-sql查询。

我的配置文件是:

/etc/odbc.ini

[asterisk-connector]
Description     = MS SQL connection to 'asterisk' database
Driver          = /usr/lib64/libtdsodbc.so
Setup           = /usr/lib64/libtdsS.so
Servername      = SQL2
Port            = 1433
Username        = MyUsername
Password        = MyPassword
TDS_Version     = 7.0

/etc/odbcinst.ini

[odbc-test]
Description = TDS connection
Driver = /usr/lib64/libtdsodbc.so
Setup = /usr/lib64/libtdsS.so
UsageCount = 1
FileUsage = 1

/etc/asterisk/res_odbc.conf

[asterisk-connector]
enabled => yes
dsn => asterisk-connector
username => MyUsername
password => MyPassword
pooling => no
limit =>
pre-connect => yes

当我传入密码和用户名时,我可以通过ISQL连接:

[root@TestVM etc]# isql -v asterisk-connector MyUsername MyPassword
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>

..但我应该可以在没有用户名/密码的情况下连接。所有返回的是:

[root@TestVM etc]# isql -v asterisk-connector
[S1000][unixODBC][FreeTDS][SQL Server]Unable to connect to data source
[01000][unixODBC][FreeTDS][SQL Server]Adaptive Server connection failed
[ISQL]ERROR: Could not SQLConnect

就好像ISQL无法从配置文件中读取用户名和密码。

我需要能够在Asterisk拨号方案中执行MS-SQL查找,但为了实现这一点,我必须能够仅使用数据源名称调用ISQL,并且无法传递身份验证参数。

我在线阅读的所有指南都说我应该只能连接

isql -v asterisk-connector

命令,但这并没有发生在我身上。

我已经把头发拉了几天,所以任何有关正确方向的帮助或指示都会非常感激。

提前致谢。

编辑:

我打开了日志记录,可能有一些线索。用户名和密码肯定不会被传入。看:

[ODBC][27557][1455205133.129690][SQLConnect.c][3614]
                Entry:
                        Connection = 0xac3080
                        Server Name = [asterisk-connector][length = 18 (SQL_NTS)]
                        User Name = [NULL]
                        Authentication = [NULL]
                UNICODE Using encoding ASCII 'ISO8859-1' and UNICODE 'UCS-2LE'

                DIAG [01000] [FreeTDS][SQL Server]Adaptive Server connection failed

                DIAG [S1000] [FreeTDS][SQL Server]Unable to connect to data source

因此,此处的用户名和身份验证为[NULL]。它显然没有在odbc.ini或res_odbc.conf中获取用户名/密码,但问题是原因。我会继续调查:)

EDIT2:

OSQL实用程序返回:

[root@TestVM etc]# osql -S SQL2 -U MyUsername -P MyPassword
checking shared odbc libraries linked to isql for default directories...
strings: '': No such file
        trying /tmp/sqlH ... no
        trying /tmp/sqlL ... no
        trying /etc ... OK
checking odbc.ini files
        reading /root/.odbc.ini
[SQL2] not found in /root/.odbc.ini
        reading /etc/odbc.ini
[SQL2] found in /etc/odbc.ini
found this section:
looking for driver for DSN [SQL2] in /etc/odbc.ini
  no driver mentioned for [SQL2] in odbc.ini
looking for driver for DSN [default] in /etc/odbc.ini
osql: error: no driver found for [SQL2] in odbc.ini

4 个答案:

答案 0 :(得分:0)

我会替换"用户名"使用" UID "和#34;密码"与" PWD "在你的odbc.ini ....来自FreeTDS Manual - Chapter 4 - Preparing ODBC

  

这个难题的原始ODBC解决方案使用了odbc.ini文件。 odbc.ini存储有关服务器的信息,通常称为数据源名称(DSN)。通过调用函数SQLConnect(DSN,UID,PWD)连接到服务器的ODBC应用程序,其中DSN是odbc.ini中的数据源名称条目,UID是用户名,PWD是密码。有关DSN的任何和所有信息都保存在odbc.ini中。一切都是对的。

     

ODBC 3.0规范引入了一个新功能:SQLDriverConnect。连接属性作为单个参数提供,这是一串连接的名称 - 值对。 SQLDriverConnect包含SQLConnect的功能,因为名称 - 值对字符串允许调用者传递 - 另外还有原始DSN,UID和PWD - 驱动程序可以接受的任何其他参数。此外,应用程序可以指定使用哪个驱动程序。实际上,可以将整个DSN属性集指定为SQLDriverConnect的参数,从而避免了对odbc.ini的需求。这导致使用了所谓的无DSN配置,没有odbc.ini的设置。

答案 1 :(得分:0)

好的,所以我解决了它(差不多)。我的odbc文件中的密码和用户名被忽略了。因为我从Asterisk调用数据库查询,所以我也使用了一个名为res_odbc.ini的文件。这也包含我的用户名和密码,当我从Asterisk运行查询时,它会连接并返回正确的结果。

如果有帮助,这是我的最终工作配置。

ODBC.INI

[asterisk-connector]
Description = MS SQL connection to asterisk database
driver = /usr/lib64/libtdsodbc.so
servername = SQL2
Port = 1433
User = MyUsername
Password = MyPassword

ODBCINST.INI

[FreeTDS]
Description = TDS connection
Driver = /usr/lib64/libtdsodbc.so
UsageCount = 1

[ODBC]
trace           = Yes
TraceFile       = /tmp/sql.log
ForceTrace      = Yes

freetds.conf

#   $Id: freetds.conf,v 1.12 2007/12/25 06:02:36 jklowden Exp $
#
# This file is installed by FreeTDS if no file by the same
# name is found in the installation directory.
#
# For information about the layout of this file and its settings,
# see the freetds.conf manpage "man freetds.conf".

# Global settings are overridden by those in a database
# server specific section
[global]
        # TDS protocol version
;       tds version = 4.2

        # Whether to write a TDSDUMP file for diagnostic purposes
        # (setting this to /tmp is insecure on a multi-user system)
        dump file = /tmp/freetds.log
;       debug flags = 0xffff

        # Command and connection timeouts
;       timeout = 10
;       connect timeout = 10

        # If you get out-of-memory errors, it may mean that your client
        # is trying to allocate a huge buffer for a TEXT field.
        # Try setting 'text size' to a more reasonable limit
        text size = 64512

# A typical Sybase server
[egServer50]
        host = symachine.domain.com
        port = 5000
        tds version = 5.0

# A typical Microsoft server
[SQL2]
        host = 192.168.1.59
        port = 1433
        tds version = 8.0

res_odbc.conf

[asterisk-connector]
enabled = yes
dsn = asterisk-connector
username = MyUsername
password = MyPassword
pooling = no
limit = 1
pre-connect = yes

请记住,如果您使用Centos 64位来修改lib64的驱动程序路径。大多数在线指南都有错误的(64位)路径。

祝你好运 - 这很令人头痛:)

答案 2 :(得分:0)

我联系了unixODBC的开发人员Nick Gorham关于这个问题,他确认 isql没有从配置文件中读取用户名/密码

  

嗨尼克,

     

我认为unixODBC是一个伟大的项目,但我很惊讶地看到它   是不安全的(至少我不知道如何正确使用它。)

     

当我使用isql连接到数据库时,我必须输入   密码。在共享服务器上,这是不安全的,因为

     

$ ps -aux

     

命令以明文形式显示密码。

     

有没有解决方法?我可以将密码放在可读的文件中吗?   只有我的用户?

     

感谢您的帮助。

答案:

  

您好,

     

这取决于司机。有些人可以从中读取用户和密码   odbc.ini或〜/ .odbc.ini文件,以便您可以在那里存储密码。

     

isql仅设计为一个简单的测试应用程序,没有任何停止   你修改ilsq从文件中提取用户和密码   您的选择,如果需要可以解密。

答案 3 :(得分:0)

我遇到了一个稍微不同的问题,但我的谷歌搜索将我带到了这里。尝试通过 isql 连接时,即使我在 odbc.ini 文件中指定了一个用户,我也收到了 Login failed for user ''

[SQLSERVER_SAMPLE]
Driver=ODBC Driver 17 for SQL Server
Server=SERVER
Database=DATABASE
Trusted_Connection=no
UID=USER
PWD=PASSWORD

我尝试了 UIDUser,但都出现了相同的错误。阅读 @Andrei Sura 的解决方案后,我发现用户名和密码被忽略了。

我的解决方案是运行 isql -v SQLSERVER_SAMPLE USER PASSWORD,即使在 odbc.ini 文件中指定了用户名和密码 - 并且它已连接。