当作为Windows服务运行时,Pyodbc SQL Server连接不起作用

时间:2017-12-05 11:08:36

标签: sql-server windows-services pyodbc

我使用以下代码创建与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'
                      )

但现在我使用nssm工具创建了Windows服务。该服务只运行.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 个答案:

答案 0 :(得分:0)

使用管理员帐户运行服务。

答案 1 :(得分:0)

错误消息中的答案!如果您不熟悉服务帐户和SQL Server,这些事情可能是一个挑战。如果您无法打开登录中指定的数据库,通常是以下之一:

  1. 连接字符串中指定的数据库名称不存在。
  2. 数据库中未指定用户映射到您正在使用的登录名。
  3. 您正在将不同Windows服务帐户下的应用程序(在本例中为您的服务)运行到以前开发代码的应用程序, (即:Windows服务帐户) )帐户没有在SQL Server中定义的登录和/或用户,无论是在登录的服务器级别,还是在登录时存在的数据库级别。
  4. 最简单的解决方案是记录您的服务正在运行的Windows帐户,然后在您的服务尝试连接的SQL Server中检查是否存在同一帐户作为登录。如果没有,那就是你的问题,你只需要创建登录,并确保它在数据库中有一个关联的用户(登录只会让你进入服务器,而不是数据库)。 但是,如果登录确实存在,请检查a)数据库是否存在,b)(重要!)该数据库中存在映射到服务帐户登录的用户。

    除此之外,以前关于使用具有管理员权限的帐户运行服务的答案不太可行,除非您使用的是旧版本的SQL Server。 Windows系统管理员自动具有对数据库服务器及其数据的自动权限的能力很久以前就已被删除,因此使用Windows管理员帐户将无法正常工作,或者如果有的话,将无法继续使用。

    如果这不能解决问题,请告诉我。