【问题标题】:Cross Server Select In SQLAlchemySQLAlchemy 中的跨服务器选择
【发布时间】:2016-02-05 11:36:27
【问题描述】:

是否可以让 SQLAlchemy 进行跨服务器连接?

如果我尝试运行类似

engine = create_engine('mssql+pyodbc://SERVER/Database')

query = sql.text('SELECT TOP 10 * FROM [dbo].[Table]')

with engine.begin() as connection:
    data = connection.execute(query).fetchall()

它按我的预期工作。如果我将查询更改为从 [OtherServer].[OtherDatabase].[dbo].[Table] 中进行选择,我会收到一条错误消息 "Login failed for user 'NT AUTHORITY\\ANONYMOUS LOGON"

【问题讨论】:

  • 当您需要在与不同服务器的连接中对服务器执行查询时,这种情况很奇怪。为什么不能只有两个独立的连接?
  • 是的。实际的查询是在做一个INSERT INTO,以及一堆体操,比如先截断表格,然后使用TABLOCKX。需要通过一个连接完成。

标签: python sql sql-server sqlalchemy


【解决方案1】:

您对 SQL Server 的身份验证方式似乎存在问题。

我相信你可以使用当前的 Windows 用户进行连接,URI 语法是 mssql+pyodbc://SERVER/Database?trusted_connection=yes(我从未测试过,但试一试)。

另一种选择是创建 SQL Server 登录名(即在 SQL Server 中定义的用户名/密码,而不是 Windows 用户)并在连接时使用 SQL Server 登录名。

然后数据库 URI 变为:mssql+pyodbc://username:password@SERVER/Database

【讨论】:

    【解决方案2】:

    mssql+pyodbc://SERVER/Database?trusted_connection=yes 在我尝试时抛出了一个错误。不过它确实为我指明了正确的方向。

    from sqlalchemy import create_engine, sql
    import urllib
    
    string = "DRIVER={SQL SERVER};SERVER=server;DATABASE=db;TRUSTED_CONNECTION=YES"
    params = urllib.quote_plus(string)
    engine = create_engine('mssql+pyodbc:///?odbc_connect={0}'.format(params))
    
    
    query = sql.text('SELECT TOP 10 * FROM [CrossServer].[datbase].[dbo].[Table]')
    
    with engine.begin() as connection:
        data = connection.execute(query).fetchall()
    

    【讨论】:

      【解决方案3】:

      如果您想通过一个连接更改不同的服务器,这将非常复杂。 但是,如果您需要在不同的凭据下对不同的服务器执行查询,您应该首先使用sp_addlinkedserver 添加链接服务器。然后应该使用sp_addlinkedsrvlogin 将凭据添加到链接服务器。你试过吗?

      【讨论】:

      • 是的。服务器已链接。我可以在 SQL Server 中正常运行查询。
      猜你喜欢
      • 2010-10-23
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 2013-01-27
      • 1970-01-01
      相关资源
      最近更新 更多