简介
本文描述了 Microsoft® SQL Server™ 2000 查询处理器如何与 OLE DB 提供程序进行交互以实现分布式和异类查询。它面向的读者主要是 OLE DB 提供程序开发人员,并假设读者对 OLE DB 规范有深入的了解。本文重点在于描述 SQL Server 查询处理器和 OLE DB 提供程序之间的 OLE DB 接口,而不是分布式查询功能本身。有关分布式查询功能的完整描述,请参阅 SQL Server Books Online。
概述和术语
在 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 函数的参数中提取相同的信息。
有关使用四段式名称建立链接服务器和基于特殊名称的语法的详细说明,请参阅 SQL Server Books Online。
连接 OLE