【问题标题】:Pyodbc SQL Server connection doesn't work, when run as a windows service当作为 Windows 服务运行时,Pyodbc SQL Server 连接不起作用
【发布时间】:2017-12-05 11:08:36
【问题描述】:

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

这怎么可能?

【问题讨论】:

    标签: sql-server windows-services pyodbc


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      1. 连接字符串中指定的数据库名称不存在。
      2. 数据库中没有指定用户映射到您正在使用的登录名。
      3. 您正在使用不同于之前开发代码的 Windows 服务帐户运行应用程序(在本例中为您的服务),并且那个(即:Windows 服务帐户) 帐户没有在 SQL Server 中定义的登录名和/或用户,无论是在用于登录的服务器级别,还是在数据库级别(如果存在登录名)。

      最简单的解决方案是记录您的服务在哪个 Windows 帐户下运行,然后在您的服务尝试连接的 SQL Server 中检查该帐户是否作为登录帐户存在。如果没有,那是您的问题,您只需要创建登录名,并确保它在数据库中有关联的用户(登录名只会让您进入服务器,而不是数据库)。 但是,如果登录确实存在,请检查 a) 数据库是否存在和 b)(重要!)该数据库中存在映射到服务帐户登录的用户。

      顺便说一句,除非您使用的是旧版本的 SQL Server,否则先前关于使用具有管理员权限的帐户运行服务的答案不太可能起作用。 Windows 系统管理员自动拥有对数据库服务器及其数据的自动权限的能力在很久以前就被删除了,因此使用 Windows 管理员帐户要么不起作用,要么不会在未来得到证明。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-01
        • 2012-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多