【问题标题】:Connect to Linked Server via SQL Server pyodbc connection?通过 SQL Server pyodbc 连接连接到链接服务器?
【发布时间】:2019-10-29 20:32:15
【问题描述】:

我目前可以连接到我的 SQL Server 并直接查询任何我想查询的数据库。

问题是当我想查询链接服务器时。我无法在connect() 方法中直接引用链接服务器名称,我必须先连接到本地数据库,然后对链接服务器运行OPENQUERY()

这看起来像是一个奇怪的工作。有没有办法直接查询链接服务器(根据我的研究,您不能直接连接到链接服务器),或者至少在不指定数据库的情况下连接到服务器,然后我可以在其中运行OPENQUERY()无需先连接到数据库的任何事情?

我目前要做的事情的例子:

import pyodbc

ex_value = "SELECT * FROM OPENQUERY(LinkedServerName,'SELECT * FROM LinkedServerName.SomeTable')"
# I have to connect to some local database on the server and cannot connect to linked server initially.
odbc_driver, server, db = '{ODBC Driver 17 for SQL Server}', 'MyServerName', 'LocalDatabase'

with pyodbc.connect(driver=odbc_driver, host=server, database=db, trusted_connection='yes') as conn:
    conn.autocommit = False
    cursor = conn.cursor()
    cursor.execute(ex_value)
    tables = cursor.fetchall()

    for row in tables:
        print('Row: {}'.format(row))

    cursor.close()

【问题讨论】:

  • 链接服务器不是数据库或sql server。它是一个服务器对象,允许您查询远程数据库。所以是的,你正在做的就是你必须做的。或者,当这是您想要的唯一数据时,直接连接到远程服务器。直接到源而不是通过链接服务器的额外跃点性能会更好。
  • @SeanLange 我无法直接连接到链接服务器,因为我正在构建一个供多人使用的应用程序,并且我们不想管理 100 多个用户凭据。我们在 SQL Server 上有与 Windows 身份验证相关的机器 ID,因此我们只需要管理 SQL Server 中的用户组。如果我现在正在做的是我唯一的选择,我想那很好。我将创建一个虚拟数据库,其中没有任何内容可以连接。
  • 考虑到这种情况,这可能是最好的做法。
  • @SeanLange 我认为可能是这样,但人们可能希望有一个更好的解决方案:D。感谢您的信息。

标签: python sql-server odbc pyodbc


【解决方案1】:

正如 Sean 所提到的,链接服务器只是对存储在本地服务器中的另一台服务器的引用。

不过,您不需要管理 100 多个用户凭据。如果您的用户使用 Windows 身份验证,并且您让 Kerberos 在服务器之间工作,则链接服务器可以在通过链接服务器定义连接到另一台服务器时模拟您。

然后,您可以使用 4 个部分名称来引用另一台服务器上的对象,或者在您想要更多地控制在何处执行的内容时使用 OPENQUERY。

最后,如果它们都是 SQL Server 并且都使用相同的排序规则,请确保将链接服务器选项设置为它们是排序规则兼容的。这会对您的链接服务器性能产生重大影响。我经常看到没有设置但应该设置的系统。

【讨论】:

  • 我已经提到我正在使用 Windows 身份验证并使用 OPENQUERY。此外,我们没有 kerberos,也无法获得它,因为我不控制服务器。链接的服务器都是 Oracle 和 DB2。由于 Oracle 数据类型的问题,我别无选择,只能使用 OPENQUERY。
  • 如果您只需要另一个数据库供用户连接,用户是否有任何理由不能连接到 tempdb?但是如果没有 Kerberos,我无法想象您的 Windows 凭据将通过网络连接到链接服务器的任何方式。委派工作需要它。
  • 它工作得很好。 Windows 身份验证用于授予对 SQL Server 的访问权限,身份验证组用于使用用于连接到链接服务器的内部机器 ID 授予对特定数据库的访问权限。我只是不喜欢查询链接服务器的方式。这是必需的,因为我们公司不希望将用户凭据维护到多个服务器,因为个人访问权限每 3 个月重置一次。这就是为什么我们必须走这条路。
猜你喜欢
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多