欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

mssql SQL 分布式查询处理方法

程序员文章站 2022-05-02 18:22:06
...
SQL Server 不允许使用 OPENROWSET 和 OPENDATASOURCE 进行即席分布式查询。此选项设置

为 1 时,SQL Server 允许进行即席访问。如果此选项未设置或设置为 0,则 SQL Server

不允许进行即席访问。

即席分布式查询使用 OPENROWSET 和 OPENDATASOURCE 函数连接到使用 OLE DB 的远程数据

源。OPENROWSET 和 OPENDATASOURCE 只应在引用不常访问的 OLE DB 数据源时使用。对于将

要经常访问的数据源,应定义链接服务器。

安全说明:
允许使用临时名称意味着到 SQL Server 的任何经过身份验证的登录名均可访问该访问接口

。SQL Server 管理员应对任何本地登录名都能安全访问的访问接口启用此功能。有关详细信

息,请参阅访问外部数据中的 DisallowAdhocAccess 选项。

示例
下面的示例启用即席分布式查询,然后使用 OPENROWSET 函数查询名为 Seattle1 的服务器

复制代码
sp_configure 'show advanced options', 1;
RECONFIGURE;
sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
GO

SELECT a.*
FROM OPENROWSET('SQLNCLI', 'Server=Seattle1;Trusted_Connection=yes;',
'SELECT GroupName, Name, DepartmentID
FROM AdventureWorks2008R2.HumanResources.Department
ORDER BY GroupName, Name') AS a;
GO


在 Microsoft SQL Server 2000 中,分布式查询允许 SQL Server 用户访问基于 SQL

Server 的服务器以外的数据(位于其他运行 SQL Server 的服务器或是具有 OLE DB 接口的

其他数据源中)。OLE DB 提供了统一的方式来访问异类数据源中的列表数据。
  
  在本文中,分布式查询是指任何引用了一个或多个外部 OLE DB 数据源中表或行集的

SELECT、INSERT、UPDATE 或 DELETE 语句。
  
  远程表是指存储于 OLE DB 数据源中并且不在执行查询的 SQL Server 所在服务器上的

表。一个分布式查询可以访问一个或多个远程表。
  
  OLE DB 提供程序类别
  根据 OLE DB 提供程序在 SQL Server 的分布式查询中的功能,我们将它们划分为如下

类别。根据定义,它们并非互相排斥;某种提供程序可能属于一个或多个类别:
  
  SQL 命令提供程序
  
  
  索引提供程序
  
  
  简单表提供程序
  
  
  非 SQL 命令提供程序
  SQL 命令提供程序
  凡是以 SQL 标准语法(SQL Server 认可)支持 Command 对象的提供程序,都属于此类

别。下面是 OLE DB 提供程序被 SQL Server 视为 SQL 命令提供程序的必要条件:
  
  提供程序必须支持 Command 对象及其所有强制 OLE DB 接口:ICommand、ICommandText

、IColumnsInfo、ICommandProperties 和 IAccessor。
  
  
  提供程序支持的 SQL 语法必须至少是 SQL 子集。提供程序必须通过

DBPROP_SQLSUPPORT 属性来报告语法。
  SQL 命令提供程序的示例为:Microsoft OLE DB Provider for SQL Server 和

Microsoft OLE DB Provider for ODBC。
  
  索引提供程序
  索引提供程序支持并提供与 OLE DB 对应的索引,同时还允许基于索引对基本表执行查

找。下面是 OLE DB 提供程序被 SQL Server 视为索引提供程序的必要条件:
  
  提供程序必须以 TABLES、COLUMNS 和 INDEXES 架构行集支持 IDBSchemaRowset 接口。
  
  
  提供程序必须支持通过 IOpenRowset 打开索引中的行集(通过指定索引名和相应的基本

表名称)。
  
  
  Index 对象必须支持其所有的强制接口:IRowset、IRowsetIndex、IAccessor、

IColumnsInfo、IRowsetInfo 和 IConvertTypes。
  
  
  对带索引基本表打开的行集(通过使用 IOpenRowset)必须支持 IRowsetLocate 接口,

以便根据书签在行上定位。
  如果一个 OLE DB 提供程序满足以上条件,用户可以设置提供程序选项 Index As

Access Path,以允许 SQL Server 使用提供程序的索引来执行查询。默认情况下,除非该选

项已被设置,否则 SQL Server 不会尝试使用提供程序的索引。
  
  注意:  SQL Server 支持多个影响 SQL Server 访问 OLE DB 提供程序的方法的选项

。可以使用 SQL Server 企业管理器中的“链接服务器属性”对话框来设置这些选项。
  
  简单表提供程序
  简单表提供程序通过 IOpenRowset 接口来表现根据基本表打开行集的方式。这些提供程

序既不是 SQL 命令提供程序也不是索引提供程序;而是 SQL Server 分布式查询所能处理的

提供程序中最简单的一类。
  
  对于此类提供程序,SQL Server 仅能在分布式查询运行过程执行表扫描操作。
  
  非 SQL 命令提供程序
  该类提供程序支持 Command 对象及其所有强制接口,但不支持 SQL Server 认可的 SQL

标准语法。
  
  非 SQL 命令提供程序的两个示例是:Microsoft OLE DB Provider for Indexing

Service 和 Microsoft Windows NT? Active Directory? Service Interfaces (ADSI) OLE

DB Provider。
  
  Transact-SQL 子集
  如果提供程序支持所需的 OLE DB 接口,下列 Transact-SQL 语句类别都可以用于分布

式查询。
  
  除了将远程表作为目的表的 SELECT INTO 语句外,其他所有的 SELECT 语句都可以使用


  
  
  如果提供程序支持插入操作所需的接口,INSERT 语句可以用于远程表。有关 INSERT 语

句的 OLE DB 要求的详细信息,请查阅本文后面的 INSERT 语句。
  
  
  如果提供程序满足 OLE DB 接口在特定表上的要求,UPDATE 和 DELETE 语句也可以用于

远程表。有关更新或删除远程表时 OLE DB 接口必须满足的要求和条件,请参阅本文后面的

UPDATE 和 DELETE 语句。
  游标支持
  如果提供程序支持所需的 OLE DB 功能,则分布式查询支持快照和键集两种游标。分布

式查询不支持动态游标。用户请求的分布式查询的动态游标将自动降级为键集游标。
  
  快照游标在游标打开时被写入,而且结果集保持不变;对基本表的更新、插入和删除操

作不会反映到游标中。
  
  键集游标在游标打开时被写入,而且结果集在游标的整个生存期中保持不变。但是,如

果更新或删除基本表中的行,当访问这些行时,能够在游标中看到变化。如果对基本表的插

入操作可能影响游标成员,则这种变化则是不可见的。
  
  如果提供程序满足更新和删除远程表的条件,则可以通过使用分布式查询中定义的游标

以及对远程表的引用来更新和删除远程表,例如:table UPDATE | DELETE WHERE

CURRENT OF 。有关详细信息,请参阅本文后面的 UPDATE 和 DELETE 语句。
  
  支持键集游标的要求
  如果满足所有 Transact-SQL 语法的条件,而且满足以下两种情况之一,那么在分布式

查询中就支持键集游标:
  
  在查询中,OLE DB 提供程序支持所有远程表上的可重用书签。可重用书签可以从给定表

的某个行集中隐去,然后用于同一表中的其他行集上。对可重用书签的支持是通过

IDBSchemaRowset 的 TABLES_INFO 架构行集来指定的,方法是将 BOOKMARK_DURABILITY 列

设置为 BMK_DURABILITY_INTRANSACTION 或某种更高的持久性。
  
  
  所有的远程表都通过 IDBSchemaRowset 接口的 INDEXES 行集来列出唯一键。应该存在

一个索引项,其中的 UNIQUE 列设置为 VARIANT_TRUE。
  包含 OpenQuery 函数的分布式查询不支持键集游标。
  
  支持可更新键集游标的要求
  通过在分布式查询上定义的键集游标,可以更新或删除远程表,例如:UPDATE | DELETE

WHERE CURRENT OF 。下面是在分布式查询中允许使用可更新游标的条

件:
  
  如果提供程序也满足对远程表进行更新和删除操作的条件,就允许使用可更新游标。有

关详细信息,请参阅本文后面的 UPDATE 和 DELETE 语句。
  
  
  所有的可更新键集游标操作必须位于使用可复读或更高的隔离级别的用户定义事务中。

此外,提供程序必须以 ITransactionJoin 接口支持分布式事务处理。
  OLE DB 提供程序交互阶段
  所有分布式查询的执行方案都有六种操作:
  
  建立连接和检索属性操作,指定 SQL Server 连接 OLE DB 提供程序的方法以及将用到

提供程序的哪些属性。
  
  
  表名解析和检索元数据操作,指定 SQL Server 将远程表名称(指定时使用两种方法之

一:基于链接服务器的名称或特殊名称)解析为提供程序中相应数据对象的方法。这也包括

SQL Server 为编译和优化分布式查询从提供程序检索的表元数据。
  
  
  事务管理操作,指定所有与 OLE DB 提供程序的事务相关的交互。
  
  
  数据类型处理操作,该操作指定在执行分布式查询过程中,当 SQL Server 从 OLE DB

提供程序获得数据或向其导出数据时 SQL Server 处理 OLE DB 数据类型的方法。
  
  
  错误处理操作,指定 SQL Server 使用从提供程序获得的扩展错误信息的方法。
  
  
  安全性操作,指定 SQL Server 安全性和提供程序安全性的交互方式。
  建立连接和检索属性
  SQL Server 使用 OPENROWSET 功能支持两种远程数据对象命名协议:基于链接服务器的

四段式名称和特殊名称。
  
  基于链接服务器的名称
  
  链接服务器是对 OLE DB 数据源的抽象。基于链接服务器的名称分为四段:

>...,其中 是链接服务器的名称。SQL Server 将

服务器> 视为 OLE DB 提供程序和连接属性(用于向提供程序标识数据源)的来源。其他三

个名称段被 OLE DB 数据源解释为对特定远程表的标识。
  
  特殊名称
  
  特殊名称是基于 OPENROWSET 或 OPENDATASOURCE 函数的名称。它包括在分布式查询中

每次引用远程表时的所有连接信息(包括所使用的 OLE DB 提供程序、用于标识数据源的属

性、用户 ID 和密码)。
  
  默认情况下,只允许系统管理员使用特殊名称。要使用基于 OLE DB 提供程序的特殊名

称,应将提供程序的 DisallowAdhocAccess 选项设置为 0。
  
  如果使用链接服务器名称,SQL Server 将在链接服务器定义中为 OLE DB 提供程序提取

提供程序的名称和初始化属性。如果使用特殊名称,SQL Server 将从 OPENROWSET 函数的参

数中提取相同的信息。