Невозможно подключиться к 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 - и он подключился.