FreeTDS TSQL не работает с freetds.conf - PullRequest
0 голосов
/ 29 мая 2018

Я использую freetds версии 1.00.91 от HomeBrew.Я могу успешно подключиться при обходе freetds.conf, например, с помощью следующей команды

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

Однако, когда я попытался

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

, произошла ошибка со следующей ошибкой:

Сообщение 40532 (уровень серьезности 20, состояние 1) от MYSERVER:
Невозможно открыть сервер "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

Спасибо за всю эту помощь!

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Здесь немного путаницы.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 ошибка 40532 равна Cannot open server "%.*ls" requested by the login. The login failed.

0 голосов
/ 30 мая 2018

Я сделал так, чтобы он работал, более конкретно, чтобы он работал с 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 , tsql будет обрабатывать значение -S как имя хоста, если в * не найдено имя сервера.1020 *.Вот причина, по которой работает freetds.conf.Мне нужно назвать раздел freetds.conf, используя my_hostname, потому что isql требует DSN, который соответствует разделу в freetds.conf в его 1-м аргументе.Простое использование имени хоста, у которого нет соответствующего раздела в freetds.conf, не удалось, когда я попытался.

...