【问题标题】:pyodbc on MacOS 10.14 connecting to SQL Server, fails with cron jobMacOS 10.14 上的 pyodbc 连接到 SQL Server,cron 作业失败
【发布时间】:2020-01-24 23:06:15
【问题描述】:

我有一个在 MacOS 10.14 上运行的 python3 脚本,它使用 pyodbc 连接到 SQL Server 数据库。当我手动运行它时,它工作正常,但是当我使用 crontab 安排它时,我收到此错误:

'DRIVER=/usr/local/lib/libmsodbcsql.17.dylib;' pyodbc.Error: ('HY000','[HY000] [Microsoft][ODBC Driver 17 for SQL Server]SSPI Provider:  No credentials were supplied, or the credentials were unavailable or inaccessible. (458752) (SQLDriverConnect)')

我作为托管用户运行,通过 AD 连接,并且我的帐户有权使用这些凭据访问数据库。

这是蟒蛇:

#!/usr/bin/env python

import pyodbc

conn = pyodbc.connect(
  'DRIVER=/usr/local/lib/libmsodbcsql.17.dylib;'
  'SERVER=[SERVER NAME];'
  'DATABASE=[DATABASE];'
  'Trusted_Connection=yes;'
)

cursor = conn.cursor()
cursor.execute("SELECT * FROM [TABLE]")

当然要使用适当的服务器、数据库和表。

我认为这与托管用户和 cron 用户之间的细微差别有关,但我不知道如何解决这个问题。出于安全原因,为该服务器创建 SQL 托管帐户是不可行的。

【问题讨论】:

  • 你为什么使用/usr/local/lib/libmsodbcsql.17.dylib;作为驱动程序而不是{ODBC Driver 14 for SQL Server}只是好奇?

标签: python sql-server cron pyodbc


【解决方案1】:

错误消息告诉您需要凭据。将 UID=username;PWD=password 添加到 pyodbc.connect 字符串参数,例如,

pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)

【讨论】:

  • Trusted_Connection=yes 取代了对 UID 和 PWD 的需求。 UID 和 PWD 仅适用于 SQL 管理的凭据,但我需要依赖 Active Directory 身份验证。抱歉,如果我的问题不够清楚。当我从终端运行上面的代码时,它可以正常工作;只有当我将它添加到 crontab 时才会出现问题。
【解决方案2】:

您可能正在使用默认的root 用户设置您的 crontab,该用户可能没有与之关联的活动目录凭据。尝试使用 crontab -u <username> 设置您的 crontab,使用您能够成功手动运行脚本的相同用户名。请查看此答案以获取更多详细信息:https://stackoverflow.com/a/8476992/1506086

【讨论】:

    【解决方案3】:

    在您的代码之前和之后运行 os ping 命令,ping 的目标是数据库和服务器名称。在 cmd 框中使用相同的数据库和服务器名称执行 ping 命令 shell 脚本并与 SQL 连接脚本中的比较。使用结果来修改您的代码。


    #Look at the subprocess module in the standard library:
    import subprocess
    subprocess.run(["ping <server Name>", "-l"])
    

    【讨论】:

      【解决方案4】:

      尝试在您的帐户下创建一个 cron 作业。我在 centos 上测试过它对我有用。

      【讨论】:

        【解决方案5】:

        cron 作业作为系统运行,不再访问 mac 上的用户凭据(好吧,它已被弃用)。

        您需要使用 launchd 来运行用户代理。

        基本步骤是

        为它创建一个作业定义.plist

        <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
        <plist version="1.0">
            <dict>
                <key>Label</key>
                <string>local.myJob</string>
                <key>Program</key>
                <string>/Users/user/Scripts/myScript.py</string>
                <key>RunAtLoad</key>
                <true/>
            </dict>
        </plist>
        

        将 .plist 保存到 ~/Library/LaunchAgents/local.myJob.plist,使其成为用户代理而不是系统守护程序。

        将脚本放在.plist Program Key中指定的位置

        添加要启动的作业

        launchctl load ~/Library/LaunchAgents/local.myJob.plist
        

        开始

        launchctl start local.myJob
        

        【讨论】:

        • 非常感谢!几个星期以来,我一直在努力解决这个问题!
        猜你喜欢
        • 2018-12-05
        • 1970-01-01
        • 2021-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-08
        • 2020-07-20
        • 2015-12-05
        相关资源
        最近更新 更多