Подключение к SQL Server с аутентификацией pyodbc, FreeTDS и Kerberos в macOS

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

Сводка: я могу подключиться к базе данных и запросить ее с помощью проверки подлинности Kerberos через Azure Data Studio и tsql с помощью FreeTDS. Я не могу подключиться к pyodbc. Я безуспешно пробовал десятки различных конфигураций.

Моя конечная цель - подключиться к БД сервера MSSQL с помощью python.

Спасибо за любой вклад.

Фон

локальный компьютер macOS 10.15.4 Подключен к VPN, необходим для проверки подлинности Kerberos Успешно запрошен БД из базы данных Azure Data Studio - Microsoft SQL Server 2016

FreeTDS

tsql -S -U 'directory \ username' -> Работает, может запрашивать БД

isql

isql dsn_name 'каталог \ имя пользователя' 'пароль'

ошибка DIAG [42000] [FreeTDS] [SQL Server] Ошибка входа. Логин из ненадежного домена и не может использоваться с аутентификацией Windows.

isql dsn_name 'каталог \ имя пользователя'

ошибка: DIAG [42000] [FreeTDS] [SQL Server] Ошибка входа. Логин из ненадежного домена и не может использоваться с аутентификацией Windows.

pyodbc

cnxn = pyodbc.connect ('DSN = dsn_name; Trusted_Connection = yes')

ошибка: pyodbc.ProgrammingError: ('42000', '[42000] [FreeTDS] [SQL Server] Ошибка входа. Вход из ненадежного домена и не может использоваться с проверкой подлинности Windows. (18452) (SQLDriverConnect)')

cnxn = pyodbc.connect ('DSN = dsn_name; UID = directory \ username; PWD = "пароль"')

ошибка: DIAG [01000] [FreeTDS] [SQL Server] Ошибка подключения адаптивного сервера pyodbc.OperationalError: ('08001', '[08001] [FreeTDS] [SQL Server] Невозможно подключиться к источнику данных (0) (SQLDriverConnect) » )

Конфигурация

krb5.conf

libdefaults

default_realm = домен

[царства]

domain_same_as_default = {

kdc = kdc_address

}

odbc.ini

[dsn_name]

Описание = Сервер MSSQL

Драйвер = FreeTDS

Servername = имя_сервера

odbcinst.ini

[FreeTDS]

Описание = Драйвер FreeTDS для Linux и MSSQL

Драйвер = / usr / local / lib / libtdsodbc.so

Настройка = / usr / local / lib / libtdsodbc.so

UsageCount = 1

[ODBC] Trace = Да

TraceFile = / dev / stdout

freetds.conf

[server_name] host = ip_address

порт = номер_порта

база данных = db_name

REALM = ДОМЕН


person BirdDog    schedule 07.04.2020    source источник


Ответы (1)


Я избегал использования DSN с pyodbc, так как предпочитаю хранить всю свою конфигурацию в одном месте. Вот пример строки подключения, которую я использую с доменом.

con = pyodbc.connect(
    r"DRIVER={FreeTDS};"
    r'SERVER=mssql.mydomain.com;'
    r"PORT=1433;"
    r"DATABASE=my_db;"
    f"UID=MYDOMAIN\\my_username;"
    f"PWD=my_password;"
    r"TDS_Version=7.3;"
    r"Encrypt=yes;"
    r"Trusted_Connection=yes;"
)

Дать этому кружку? Две обратные косые черты (\\) необходимы для экранирования при использовании аутентификации домена Windows, это не опечатка. Главное, чего вам может не хватать, - это TDS_Version. Вы можете узнать больше о версиях TDS здесь: https://www.freetds.org/userguide/ChoosingTdsProtocol.html

Удачи!

person FlipperPA    schedule 08.04.2020
comment
Спасибо за вклад. С этой модификацией я получаю следующую ошибку: Не удалось подключиться к адаптивному серверу. - person BirdDog; 08.04.2020
comment
Итак, у меня есть две неидеальные идеи. (1) Если можете, создайте для подключения учетную запись аутентификации SQL Server, а не учетную запись аутентификации Windows. Это всегда лучшая идея. Собственный драйвер Microsoft для Linux не поддерживает аутентификацию Windows, поддерживает только FreeTDS. (2) Проверьте этот поток, чтобы узнать об ошибке, которую вы получаете от isql: stackoverflow.com/questions/18603696/ - person FlipperPA; 11.04.2020
comment
Спасибо за направление! - person BirdDog; 15.04.2020