【问题标题】:Why is using OPENQUERY on a local server bad?为什么在本地服务器上使用 OPENQUERY 不好?
【发布时间】:2010-03-03 20:37:07
【问题描述】:

我正在编写一个脚本,它应该在一堆服务器上运行并从中选择一堆数据,包括本地服务器。选择我需要的数据所需的 SQL 非常复杂,所以我正在编写一种临时视图,并使用 OPENQUERY 语句来获取数据,所以最终我最终会遍历这样的语句:

exec('INSERT INTO tabl SELECT * FROM OPENQUERY(@Server, @AdHocView)')

但是,我听说在本地服务器上使用 OPENQUERY 是不受欢迎的。有人可以详细说明为什么吗?

【问题讨论】:

  • 这是一个管理脚本,所以我不担心权限问题。具体来说,我的问题是,当脚本遍历服务器列表并运行到它自己的服务器名称时,是否有任何顾虑?这通常会抛出一个错误,服务器未配置数据访问,可以通过 EXEC sp_serveroption 'LocalServer', 'DATA ACCESS', TRUE 来纠正

标签: sql sql-server sql-server-2005 tsql openquery


【解决方案1】:
  • 虽然查询可能返回多个结果集,但 OPENQUERY 只返回第一个。
  • OPENQUERY 不接受变量作为其参数。
  • OPENQUERY 不能用于在链接服务器上执行扩展存储过程。但是,可以使用四部分名称在链接服务器上执行扩展存储过程。
  • 如果在同一个脚本中使用sp_addlinkedserver 存储过程,则远程服务器上使用的凭据被硬编码到脚本中,任何拥有副本的人都可以看到

参考:

【讨论】:

  • 前几天我碰巧有机会使用OPENQUERY,发现你的第4点是错误的; OPENQUERY 在链接服务器上运行,因此没有硬编码凭据。你可能会想到OPENROWSET
  • @Aaronaught:如果存在链接服务器实例,为什么还要使用 OPENQUERY?如果在同一个脚本中使用sp_addlinkedserver 存储过程,我的观点是有道理的。
  • 好吧,既然你问了,实际上有一个理由使用OPENQUERY:性能。 OPENQUERY 允许在远程服务器上处理查询,而标准的 4 部分命名必须将所有行复制到本地服务器,这对于大型数据集非常不利。当然,这必须与您提到的其他取舍进行权衡。
  • @OMGPonies 这是旧的,但我今天有另一个例子。在链接服务器上使用 OPENQUERY 的另一个原因是,链接服务器可能未使用与编写代码的 SQL 兼容的 SQL,因此如果要正常执行 SQL 调用,则无法编译。
【解决方案2】:

除了@OMG Ponies 所说的之外,这根本没有必要。当您不需要时,没有理由引入临时查询和分布式事务语义。当您使用OPENQUERY 时,您承担了动态 SQL 的所有负面影响,包括不可预测的计划和服务器无法准确跟踪依赖关系。

OPENQUERY 还要求本地用户对目标服务器具有权限,这可能不是您想要的,除非它是一个管理脚本。您不能期望一个数据库的每个用户对其他所有数据库都具有相同的权限。

【讨论】:

    【解决方案3】:

    只是一个后续。

    当您必须比较或操作存储过程中的某些行集时,

    OpenQuery 非常有用。

    例如,当您从 SQL Server 2005 迁移到 SQL Server 2008 时,如果您必须比较两台服务器(测试和推出服务器)的结果,那么您可以做如下查询:

    select * into test_table from OpenQuery(testServer, 'exec testdb.dbo.test_sp');
    select * into rollout_table from OpenQuery(rolloutServer, 'exec testdb.dbo.test_sp');
    
    select * from test_table
    except
    select * from rollout_table;
    
    select * from rollout_table
    except
    select * from test_table;
    

    查看任何差异。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-12
      • 2019-05-04
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 2012-02-06
      相关资源
      最近更新 更多