Невозможно подключиться к MS-SQL с ISQL

Первый пост на StackExchange - пожалуйста, идите спокойно:)

Я установил ODBC в Centos 6 для выполнения запросов ms-sql из моей установки Asterisk.

Мои файлы конфигурации:

файла /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 не может прочитать имя пользователя и пароль из файлов конфигурации.

Мне нужно иметь возможность выполнять поиск MS-SQL из абонентской группы Asterisk, но для этого я должен иметь возможность вызывать 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 ответа

Решение

Хорошо, так что я решил это (в значительной степени). Пароль и имя пользователя в моих файлах 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 bit для изменения пути к драйверу lib64. Большинство онлайн-руководств имеют неправильные (для 64-битных) пути.

Удачи - это головная боль:)

Я бы заменил "Имя пользователя" на "UID" и "Пароль" на "PWD" в вашем odbc.ini.... из Руководства FreeTDS - Глава 4 - Подготовка ODBC:

Оригинальное решение ODBC для этой загадки использовало файл odbc.ini. В odbc.ini хранится информация о сервере, обычно известная как имя источника данных (DSN). Приложения ODBC подключаются к серверу, вызывая функцию SQLConnect(DSN, UID, PWD), где DSN- запись имени источника данных в odbc.ini, UID - имя пользователя, а PWD - пароль. Вся информация о DSN хранится в odbc.ini. И все было правильно с миром.

Спецификация ODBC 3.0 представила новую функцию: SQLDriverConnect. Атрибуты соединения предоставляются в виде одного аргумента, строки сцепленных пар имя-значение. SQLDriverConnect включил функциональность SQLConnect в том, что строка пары имя-значение позволила вызывающей стороне передавать - в дополнение к исходному DSN, UID и PWD - любые другие параметры, которые может принять драйвер. Более того, приложение может указать, какой драйвер использовать. По сути, стало возможным указывать весь набор свойств DSN в качестве параметров для SQLDriverConnect, устраняя необходимость в odbc.ini. Это привело к использованию так называемой конфигурации без DSN- установки без odbc.ini.

Я связался с Ником Горхамом, разработчиком unixODBC, об этой конкретной проблеме, и он подтвердил, что isql не читает имя пользователя / пароль из файла конфигурации

Привет ник,

Я думаю, что unixODBC - отличный проект, но я был удивлен, увидев, что он небезопасен (или, по крайней мере, я не знаю, как правильно его использовать).

Когда я подключаюсь к базе данных с помощью isql, я должен ввести пароль. На общем сервере это небезопасно, потому что

$ ps –aux

Команда показывает пароль в открытом виде.

Есть ли решение для этого? Могу ли я поместить пароль в файл, который может прочитать только мой пользователь?

Спасибо за помощь.

Ответ:

Привет,

Это зависит от водителя. Некоторые могут прочитать имя пользователя и пароль из файла odbc.ini или ~/.odbc.ini, чтобы вы могли хранить пароль там.

isql разработан как простое тестовое приложение, и ничто не мешает вам изменить ilsq, чтобы извлечь пользователя и пароль из файла по вашему выбору, расшифровав его при необходимости.

У меня была немного другая проблема, но мой поиск в Google привел меня сюда. При попытке подключиться через isql я получал Login failed for user '' хотя я указал пользователя в моем файле odbc.ini

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

Я пробовал оба UID а также User, но оба дали одну и ту же ошибку. Прочитав решение @Andrei Sura, я понял, что имя пользователя и пароль игнорируются.

Моим решением было бежать isql -v SQLSERVER_SAMPLE USER PASSWORD хотя имя пользователя и пароль были указаны в файле odbc.ini - и он подключился.

Другие вопросы по тегам