Соединение Pyodbc с SQL Server не работает при запуске в качестве службы Windows
Я использую следующий код, чтобы создать соединение с базой данных SQL Server. Когда я просто запускаю приложение фляги, оно работает нормально.
cnxn = pyodbc.connect(driver='{ODBC Driver 13 for SQL Server}',
server='my_user',
database='my_db',
username='my_username',
password='pass',
trusted_connection='yes'
)
Но теперь я создал службу Windows, используя инструмент nssm. Сервис просто запускает.bat файл, который запускает мой сервис.
pyodbc.InterfaceError: ('28000', '[28000] [Microsoft][ODBC Driver 13 for SQL Server]
[SQL Server]Login failed for user \'WORKGROUP\\my_user$\'. (18456) (SQLDriverConnect);
[28000] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Cannot open database
"my_db" requested by the login.
The login failed. (4060); [28000] [Microsoft]
[ODBC Driver 13 for SQL Server]Invalid connection string attribute (0);
Как это возможно?
2 ответа
Ответ в сообщении об ошибке! Эти вещи могут быть проблемой, если вы не знакомы с учетными записями служб и SQL Server. Если вы не можете открыть базу данных, указанную при входе в систему, обычно это одна из следующих вещей:
- Имя базы данных, указанное в строке подключения, не существует.
- В базе данных не указан пользователь для сопоставления с именем входа, которое вы используете.
- Вы запускаете приложение (в данном случае, свою службу) под учетной записью службы Windows, отличной от той, под которой ранее был разработан код, и эта учетная запись (т. Е. Учетная запись службы Windows) не имеет имени для входа и / или пользователь, определенный в SQL Server, либо на уровне сервера для входа в систему, либо на уровне базы данных, если имя входа существует.
Простейшим решением было бы записать, под какой учетной записью Windows работает ваша служба, а затем проверить, что такая же учетная запись существует в качестве имени входа, в SQL Server, к которому ваша служба пытается подключиться. Если это не так, то это ваша проблема, и вам просто нужно создать логин и убедиться, что у него есть связанный пользователь в базе данных (логин доставляет вас только на сервер, а не в базы данных). Однако, если имя входа существует, проверьте, что a) база данных существует и b) (ВАЖНО!) В этой базе данных существует пользователь, который сопоставляется с учетной записью службы.
Кроме того, предыдущий ответ о запуске службы с учетной записью, обладающей правами администратора, вряд ли будет работать, если вы не используете старую версию SQL Server. Автоматическая способность системных администраторов Windows иметь автоматические права на сервер базы данных и его данные была удалена давно, поэтому использование учетной записи администратора Windows либо не будет работать, либо не будет подтверждено в будущем, если это произойдет.
Дайте мне знать, если это не поможет.